Lucene/Elasticsearch/Solr中最少的单词匹配数

问题描述:

我查询的文本(和查询本身)平均有11个单词(最多约25个)。我希望我的查询仅在查询中的至少一半单词在文本中匹配时才返回匹配。Lucene/Elasticsearch/Solr中最少的单词匹配数

例如,这是我最初的Lucene的查询的样子(为简单起见,它只有4个字):

jakarta~ apache~ lucene~ *~ 

它会返回一个匹配,如果的话至少一个模糊匹配,但我只有当至少有任何两个单词(半数4个)模糊匹配时才希望它返回匹配。

在Lucene中可能吗?

我可能分裂我这样的查询(OR是Lucene的默认运算符):

(jakarta~ apache~) AND (lucene~ *~) 

但不会返回匹配既是jakartaapache匹配但没有lucene*匹配。

我可以改变我的查询:

(jakarta~ AND apache~) (jakarta~ AND lucene~) (jakarta~ AND *~) 
(apache~ AND lucene~) (apache~ and *~) (lucene~ AND *~) 

请问这是否有效?平均而言,我的表达将包含462 AND条款(二项系数为11和6),最坏的情况下为5200300 AND条款(二项系数为25和13)。

如果在Lucene中不可能(或者没有意义的性能),那么在Elasticsearch或Solr中可能吗?

对于数据库中至少10 000个文本,它应该工作得很快(< = 0.5秒/搜索)。

如果我稍后可以轻松更改最低匹配百分比(例如,40%而不是50%),那就更好了,但我可能不需要这样做。

在Solr中,您可以使用minimum match (mm) parameter与DisMax和eDisMax,并且您可以指定预期匹配的百分比。

+0

这看起来像我后。我会尝试Solr,谢谢! – Rusty

所有三个选项都支持可选查询子句中的最小匹配功能。

+0

谢谢。有没有在查询分析器语法中使用'BooleanQuery.Builder.setMinimumShouldMatch'的方法?我通过Neo4j REST API使用Lucene。我可以使用自定义的Lucene分析器。 – Rusty

+0

@Rusty - 不,标准查询语法分析器恐怕不支持它,而且我真的不熟悉Neo4j在那里建议最好的方法。 – femtoRgon