【问题标题】:elasticsearch: or operator, number of matcheselasticsearch:或运算符,匹配数
【发布时间】:2018-06-05 06:53:02
【问题描述】:

使用“或”运算符时,是否可以根据匹配数对我的搜索进行评分?

目前查询如下:

"query": {
  "function_score": {
    "query": {
      "match": {
        "tags.eng": {
        "query": "apples banana juice",
        "operator": "or",
        "fuzziness": "AUTO"
        }
      }
    },
    "script_score": {
      "script": # TODO
    },
    "boost_mode": "replace" 
  }
}

我不想使用“and”运算符,因为我希望找到包含“apple juice”的文档,以及仅包含“juice”的文档等。但是包含三个单词的文档应该得分更高比包含两个词或单个词的文档,等等。

我在这里找到了一个可能的解决方案https://github.com/elastic/elasticsearch/issues/13806 它使用布尔查询。但是我不知道如何访问分析器生成的令牌(在本例中:苹果、香蕉、果汁)。

有什么帮助吗?

【问题讨论】:

  • 我认为您要做的是创建自己的搜索算法。一般来说,您的前提应该有效。但是,如果文档中有 5 次苹果,或者只有一个文档中有苹果,那肯定比所有其他有香蕉的文档更相关的答案吗?或者......你明白我的意思了 :) BM25 是现在计算这种相关性的方式。您可以查看elastic.co/guide/en/elasticsearch/reference/current/… 以微调此过程或提出您自己的过程。
  • 感谢您的评论。我之前没有提到,但我不是在搜索文本。我正在搜索以前标记的文档,频率并不重要。我试图用另一个例子来澄清。假设我正在搜索“blue sky”,并且有 4 个文档标记为:[sky, moon], [blue car, blue jeans, city], [blue sea, sky, surf], [blue sky, village]。我希望第 3 次比第 1 次和第 2 次更相关,但比第 4 次要少。我目前有一个使用“and”的布尔查询,另一个使用“or”,所以我可以区分第 4 种情况,但我无法区分第 3 种和第 1 种和第 2 种。
  • 如果你还没有读过这篇文章,我想给你指出:elastic.co/guide/en/elasticsearch/guide/current/…
  • 你从语义的角度来看这个,但 ES 只看到位和字节。 blue seablue 可能看起来与您和我相似,但对于 ES,它完全不同。如果您希望带有 blue sky 标记的文档也出现在搜索 blue 中,您应该添加“蓝色”标签。
  • 谢谢@archit。我已经更新了您指向的链接,它实际上看起来很有帮助。但是,在该示例中,每个搜索词(“wifi”、“garden”、“pool”)都需要一个查询。在我的特殊情况下,我想搜索包含多个单词的术语,例如“blue sky”,并匹配整个术语以及单个单词,即由分析器生成的标记“blue”和“sky” .我的问题是:可以在查询中访问这些令牌吗?否则,你有什么建议?

标签: elasticsearch


【解决方案1】:

根据上面的讨论,我想出了以下解决方案,这与我提出问题时的想象有些不同,但适用于我的情况。

首先我定义了一个新的相似度:

"settings": {
        "similarity": {
            "boost_similarity": {
                "type": "scripted",
                "script": {
                    "source": "return 1;"
                }
            }
        }
...
}

然后我遇到了以下问题: 对带有标签 ["apple juice", "apple"] 的文档和带有标签 ["banana", "apple juice"] 的另一个文档的查询具有相同的分数。虽然我想得分更高的第二个。 从this other discussion 我发现这个问题是因为我有一个嵌套字段。我创建了一个常用的文本字段来解决它。

但我也想区分一个带有标签 [“apple”、“banana”、“juice”] 的文档和另一个带有标签 [“applebanana juice”] 的文档(所有三个词都在同一个标​​签中)。因此,最终的解决方案是为我的标签保留两个字段(嵌套字段和文本字段)。

最后,查询由带有两个 should 子句的 bool 查询组成:第一个 should 子句在文本字段上执行并使用“或”运算符。第二个 should 子句在嵌套字段上执行并使用和“和运算符”

尽管我找到了针对这个特定问题的解决方案,但在使用 ES 搜索标记文档时,我仍然面临一些其他问题。在搜索全文时,文档中的示例似乎效果很好。但是有人知道我在哪里可以找到更具体的标记文档吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2023-04-10
    • 2017-10-16
    • 2012-03-12
    • 2013-09-29
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多