【问题标题】:Hibernate Search: Searching by multiple equal wordsHibernate Search:通过多个相等的词进行搜索
【发布时间】:2018-11-08 08:02:11
【问题描述】:

我使用 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 个。

【问题讨论】:

标签: java hibernate hibernate-search


【解决方案1】:

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

我没有确切的解决方案给你,但phrase queries 看起来与你想要实现的目标非常相似。

你可以试试这样的:

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

上面将匹配两个严格遵循的“条”。如果你想更宽松一点,你可以设置 slop:

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

这将匹配两个彼此跟随或由一两个单词分隔的“条”。实际含义有点复杂,但你明白了。您可以在 org.apache.lucene.search.PhraseQuery#getSlop 的 javadoc 中找到 slop 的确切定义。

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

【讨论】:

  • 感谢您的回复!我需要它来进行严格的名称搜索。当我搜索例如 John John Smith 时,我只需要包含 3 个单词的字段:两个 John 和一个 Smith。所以通常我的目标是:如果输入 N 个单词 - 接收包含 N 个单词的字段,这些单词与输入的单词完全匹配,但顺序不限(没有一些未输入的额外单词)。 (一个字段包含全名)
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多