Lucene在java中使用复合词进行查询

Lucene在java中使用复合词进行查询,java,lucene,Java,Lucene,我对Lucene 4.3中的扳手查询有问题。 我正在尝试这样的查询: SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "golden fleece")); SpanTermQuery blackQ = new SpanTermQuery(new Term("content", "black")); SpanQuery[] clauses = {fleeceQ, blackQ}; SpanNearQuery nearQ =

我对Lucene 4.3中的扳手查询有问题。 我正在尝试这样的查询:

SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "golden fleece"));
SpanTermQuery blackQ = new SpanTermQuery(new Term("content", "black"));
SpanQuery[] clauses = {fleeceQ, blackQ};
SpanNearQuery nearQ = new SpanNearQuery(clauses, 10, false);
在我的文档的字段内容中,我有: 历史深情地看待金羊毛的黑色故事,但大多数人并不同意

那么,结果是查询没有返回任何结果。但是如果我把goldenfleece换成fleece,它就行了,所以我想问题在于复合词

我使用的是SpanarQuery,因为我必须进行邻近搜索,我需要知道它发生了多少次


有人知道如何解决这个问题吗?

问题是金羊毛不是一个术语。这是两个术语,黄金和羊毛。但是,当您自己构建术语时,使用:

new Term("content", "golden fleece")
它将接受你的话,并使它成为一个单一的术语。没有匹配项,因为索引中不存在单个术语golden fleece

没有明确的方法将短语查询合并到PanarQuery中,因此我认为创建另一个嵌套的PanarQuery来创建您正在寻找的行为可能是有意义的:

SpanTermQuery goldenQ = new SpanTermQuery(new Term("content", "golden"));
SpanTermQuery fleeceQ = new SpanTermQuery(new Term("content", "fleece"));
SpanTermQuery blackQ = new SpanTermQuery(new Term("content", "black"));

SpanQuery[] subclauses = {goldenQ, fleeceQ};
SpanNearQuery goldfleeceQ = new SpanNearQuery(subclauses, 0, true); //No slop, in order!

SpanQuery[] mainclauses = {goldfleeceQ, blackQ};
SpanNearQuery finalQ = new SpanNearQuery(mainclauses, 10, false); //As before, 10 slop, any order

非常感谢你,伙计!我不知道我怎么没有想到那件事!谢谢!