我想查询以保留关键字顺序。
例如:
SCART 1
- 我想匹配位置3,4。现在Solr
匹配位置2,3,4。
如何编写查询以满足这些要求?我还想指定斜坡距离。如果这是不可能的,我愿意接受其他建议。
索引
position | 1 2 3 4 5 6 7 8 9
token | HDMI 1 SCART 1 TV tuner yes DLNA yes
更新
我会详细解释我想要的东西。我想使用Solr
进行产品属性提取。我将抓取网上商店并将整个产品页面放入Solr
。在字段上我使用一些过滤器来删除不必要的令牌(HTML,停用词)。
到目前为止我尝试了什么:
SCART 1
- 不行,它只是在文档中随机匹配
"SCART 1"
- 不行,因为上面的例子正在运作,但有些页面写的不同 - 例如。 SCART input 1
"SCART 1"~5
- 最好的,它匹配“ SCART 输入 1 ”,但如果整个索引看起来像HDMI input 1 SCART input 1
则匹配以下令牌“ HDMI输入 1 SCART 输入 1 “
我想要的是什么:
所以我想保留关键字顺序,即使我指定了slop。如果我查询"SCART 1"~5
我希望在1
匹配后SCART
匹配,就像这样“HDMI输入1 SCART 输入 1 ” 。
我不知道是否可以通过Solr
实现这一目标,正如我所说,我愿意接受替代方案。
答案 0 :(得分:1)
标准查询解析器不具备支持此功能所需的灵活性。我不相信edismax
处理这个问题。因此,您需要使用SpanQueries自己构建查询:
SpanQuery[] clauses = new SpanQuery[2];
clauses[0] = new SpanTermQuery(new Term("field", "scart"));
clauses[1] = new SpanTermQuery(new Term("field", "1"));
Query query = new SpanNearQuery(clauses, 5, true);
如果您愿意,也可以使用其他查询解析器。 SurroundQueryParser处理这些类型的跨度,如:
5N(SCART, 1)