我查询的文本(以及查询本身)平均有11个单词(最多约25个)。我希望我的查询只有在查询中至少有一半的单词在文本中匹配时才返回匹配。
例如,这是我最初的Lucene查询的样子(为简单起见,它只有4个单词):
jakarta~ apache~ lucene~ stackoverflow~
如果至少有一个单词是模糊匹配的话,它会返回一个匹配但我希望它只在至少任意两个(一半的4个)单词模糊匹配时返回一个匹配。
Lucene有可能吗?
我可以像这样分割我的查询(OR
是Lucene中的默认运算符):
(jakarta~ apache~) AND (lucene~ stackoverflow~)
但是,如果jakarta
和apache
匹配,则不会返回匹配项,但lucene
和stackoverflow
都不匹配。
我可以将查询更改为:
(jakarta~ AND apache~) (jakarta~ AND lucene~) (jakarta~ AND stackoverflow~)
(apache~ AND lucene~) (apache~ and stackoverflow~) (lucene~ AND stackoverflow~)
这会有效吗?平均而言,我的表达式包括462 AND
个子句(二项式系数为11和6),最坏的情况是5200300 AND
个子句(二项式系数为25和13)。
如果在Lucene中不可能(或没有明智的表现),可以在Elasticsearch或Solr中使用吗?
它应该能够快速(<= 0.5秒/搜索)在数据库中至少10000个文本。
如果我以后可以轻松更改最低匹配百分比(例如40%而不是50%)会更好。但我可能不需要这个。
答案 0 :(得分:2)
所有三个选项都支持可选查询子句中的最小匹配功能。
Lucene:通过BooleanQuery.Builder.setMinimumShouldMatch
方法在BooleanQueries中设置。
Solr:The DisMax mm
parameter。
Elasticsearch:minimum_should_match
参数,Bool次查询,Multi Match查询等
答案 1 :(得分:0)
在Solr中,您可以将minimum match (mm) parameter与DisMax和eDisMax一起使用,并且可以指定预期匹配的百分比。