休眠搜索:按多个相等的单词进行搜索

时间:2018-11-08 08:02:11

标签: java hibernate hibernate-search

我使用的是Hibernate Search 5.10.3,我无法搜索仅包含N个相等单词的结果。例如,在我的索引中包含以下示例:

1. foo foo
2. foo bar

我只想获取与“ foo foo”匹配的第1行,因此我进行了以下查询:

queryBuilder.simpleQueryString().onField("myField").matching("foo + foo").createQuery();

但是此查询返回“ foo foo”和“ foo bar”。 如何使用休眠搜索做到这一点?

通常,我需要考虑其数量,以任何顺序搜索所有键入的单词。 1)搜索查询中的所有单词都必须以任意顺序在字段中2)具有相同的计数。我可以达到1),但不知道如何达到2)。示例:

1. foo bar smth
2. foo bar smth bar 

如果我搜索“ bar smth foo”,则仅需要1。如果“ bar foo bar smth”,则仅需要2。

1 个答案:

答案 0 :(得分:0)

那不是Lucene容易做到的事情。您可能想重新考虑用例,看看全文搜索是否真的是可行的方法。

我没有给您确切的解决方案,但是phrase queries看上去与您要实现的目标非常相似。

您可以尝试这样的事情:

queryBuilder.simpleQueryString().onField("myField").matching("foo smth \"bar bar\"").createQuery();

上面将匹配两个严格遵循的“条”。如果您想宽大一点,可以设置坡度:

queryBuilder.simpleQueryString().onField("myField").matching("foo smth \"bar bar\"~2").createQuery();

这将匹配两个紧随其后的“条”,或者由一个或两个单词分隔。实际含义要复杂一些,但是您可以理解。您可以在org.apache.lucene.search.PhraseQuery#getSlop的javadoc中找到Slop的确切定义。

我想使用非常高的斜率将或多或少地达到您想要的效果,但这可能会对性能产生不良影响。