0

次のような Hibernate Search エンティティ クラスがあります。

@Entity
@Indexed
@FullTextFilterDefs({
   @FullTextFilterDef(name="myFilter", impl=MyFilterFactory.class)
})
public class Parent {
   ...
   @Column
   @Field
   private String name;

   @ManyToMany
   @IndexedEmbedded
   private Set<Child> children;
   ...
}

関連付けられたエンティティも同様に簡単です。

@Entity
@Indexed
public class Child {
   ...
   @Column
   @Field
   private String name;

   @ManyToMany(mappedBy="children")
   @ContainedIn
   private Set<Parent> parents;
   ...
}

MyFilterFactory.getFilter()メソッドが次のような単純なフィールドで動作している場合Parent(図を簡単にするためにハードコーディングされています):

...
Term term = new Term("name", "daddy");
Query query = new TermQuery(term);
return new CachingWrapperFilter( new QueryWrapperFilter(query) );
...

...その後FullTextQuery、このフィルターを有効にすると、期待どおりに機能します。

ただし、埋め込みフィールドのフィールドを使用するようにフィルターを変更すると、次のようになります。

...
Term term = new Term("children.name", "Junior");
Query query = new TermQuery(term);
return new CachingWrapperFilter( new QueryWrapperFilter(query) );
...

children.name:parent=junior...その後、検索式が Luke で問題なく機能するという事実にもかかわらず、毎回 0 ヒットを取得します。

私がここに欠けているものはありますか?ルークで検索できるので、明らかに情報があります。FullTextFilter単純なフィールドではなく、このような埋め込みフィールドに対して実装するために、Hibernate Search で行う必要がある特別なことはありますか?

4

1 に答える 1

1

バグ チケットを送信するための簡単な単体テストを作成しているときに、本当の問題を発見しました。問題は、単純なフィールドと複雑なフィールドの問題ではありません。問題は、大文字と小文字に関するイライラするほどばかげた誤解でした。

通常、Hibernate Search が Lucene インデックスを作成するとき、標準アナライザーはすべてのフィールド値を小文字に変換します。クエリに Hibernate Search DSL を主に使用すると、大文字と小文字を区別しないことに慣れます。ただし、Lucene API を直接使用してクエリを実行する場合は、インデックスに一致するように検索用語を小文字にする必要があります。

最初に見た動作は、検索用語の大文字と小文字が原因でした。単純なフィールドをフィルター処理したときに、たまたますべて小文字の文字列を使用していました。複雑なフィールドをフィルター処理したときに、たまたま大文字の文字列を使用していました。

フィルタ パラメータが小文字に変換されていることを確認した後、問題は解決しました。

于 2012-10-11T16:24:31.867 に答える