我在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
,因为我必须进行邻近搜索,我需要知道它发生了多少次。
任何人都知道如何解决这个问题?
答案 0 :(得分:0)
问题是“金羊毛”不是一个术语。它有两个术语,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