これはコレクションの本質的な制限で、@IndexedEmbedded
です。コレクションのすべての要素がマージされます。
最初に質問するのは、本当にドキュメントを探していますか?異なるセクションの2つの単語が一致しないようにするには、代わりにセクションを検索したいと考えています。 この場合、Document.class
の代わりにSection.class
をターゲットにするだけでクエリを変更することができます。
あなたもDocument
内のフィールドを検索できるようにする必要があります場合 は、その後、あなたは他の方法でラウンドを埋め込むことが可能です。このように、@IndexedEmbedded
Section.document
に置く:
@Entity
@Table(name = "t_documents")
@Indexed(interceptor = DocumentIndexingInterceptor.class)
public class Document implements Serializable {
@Id
@GeneratedValue
@DocumentId
private Long id;
@ContainedIn // IMPORTANT: this will ensure that the "section" index is updated whenever a section is updated
private List<Section> sections;
//...
}
@Entity
@Table(name = "t_sections")
@Indexed // TODO: if you need it, put an interceptor here, just as in Document?
public class Section implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@DocumentId
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ndocumentid")
@IndexedEmbedded(indexNullAs = "null", includePaths = { /* LIST YOUR PATHS HERE */ })
private Document document;
@Field(name = "body",
analyze = Analyze.YES,
index = Index.YES,
store = Store.NO,
norms = Norms.NO)
@Column(name = "vbody")
private String body;
//...
}
文書であります私の主な存在。それは、タイトル、ステータス、著者、日付などのような多くのフィールドを含んでいます。それらはすべて索引付けされ、検索されます。 私は ''私はどこのタイトルが "いくつかのタイトルに等しい"とセクションのいずれかの単語 "いくつかの単語"を含むドキュメントを取得するようなクエリを取得したい –
@ジョンスミスOk。インクルードされたパスを明示的に表示したくない場合は、それらのパスを省略することができます。すべてのフィールドが含まれます。次に、あなたが与えたクエリは、ドキュメントインデックスの代わりにセクションインデックスを照会すると、 'document.title: 'といくつかのタイトル" body: "いくつかの単語" 'に翻訳されます。 –