1

SpanNearQuery在 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”就可以了,所以我猜问题出在复合词上。

我正在使用,SpanNearQuery因为我必须进行邻近搜索,并且我需要知道它发生了多少次。

有人知道怎么修这个东西吗?

4

1 回答 1

0

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

new Term("content", "golden fleece")

它会相信你的话,并使它成为一个单一的术语。没有匹配项,因为golden fleece您的索引中不存在单个术语。

没有一种明确的方法可以将 aPhraseQuery合并到 a中,因此我认为创建另一个嵌套的方法来创建您正在寻找的行为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
于 2013-08-01T15:56:21.213 回答