如何在SOLR中的短语之间进行邻近搜索?

时间:2014-11-19 15:00:04

标签: solr lucene

我该怎么做" X M" AND" Z K"在10个字左右的距离?

我在单词级别中看到它" foo bar" ~4(proximity link

我可以在pharses级别而不是在单词级别进行邻近搜索吗?

1 个答案:

答案 0 :(得分:1)

如果您不介意在匹配方面稍微宽松一点,您可以随时执行此操作:"X M Z K"~10。这符合你想要的。然而,它也会匹配其他一些东西,例如:" X A A M Z A A A K"。如果你可以容忍,那么就有了简单的答案。您还可以查看edismax查询解析器的pf2 and ps2参数,看看这些参数是否足以让您足够接近。

顺便说一句,surround query parser是围绕使用SpanQueries设计的。看起来像{!surround} 10W(1N(X, M), 1N(Z, K))这样的查询可以在这里工作,但似乎环绕不支持嵌套括号,除非我遗漏了某些东西。

如果这些不足以满足您的需求,我相信您需要直接通过Lucene API构建查询,而不是通过Solr查询语法。 SpanQuery s的组合可以完成这项工作,例如:

SpanQuery termX = new SpanTermQuery(new Term("fieldName", "X"));
SpanQuery termM = new SpanTermQuery(new Term("fieldName", "M"));
SpanQuery termZ = new SpanTermQuery(new Term("fieldName", "Z"));
SpanQuery termK = new SpanTermQuery(new Term("fieldName", "K"));
SpanQuery phraseXM = new SpanNearQuery(new SpanQuery[] {termX, termM}, 0, true);
SpanQuery phraseZK = new SpanNearQuery(new SpanQuery[] {termZ, termK}, 0, true);
SpanQuery finalQuery = new SpanNearQuery(new SpanQuery[] {phraseXM, phraseZK}, 10, false);