我在Lucene 4.3中遇到SpanNearQuery
问题。
我试图做这样的查询:
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);
在我的文档的“内容”字段中,我有:
“历史深深地看着金色羊毛的黑色故事,但大多数人不同意”
好吧,发生的是查询没有返回任何内容。但是,如果我将“金色摇粒绒”更改为“摇粒绒”,则可以使用,因此我想问题在于复合词。
我使用
SpanNearQuery
是因为我必须进行邻近搜索,并且我需要知道它发生了多少次。有人知道怎么修这个东西吗?
最佳答案
问题是“金羊毛”不是一个名词。这是两个术语,golden
和fleece
。当您自己构造术语时,可以使用:
new Term("content", "golden fleece")
它会用您的话说出来,并使其成为一个词。没有匹配项,因为索引中不存在单个词
golden fleece
。没有明确的方法将
PhraseQuery
合并到SpanNearQuery
中,因此我认为创建另一个嵌套的SpanNearQuery
来创建您要查找的行为可能是有意义的: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