【问题标题】:Elasticsearch best similarity for retrieving exact matchesElasticsearch 检索精确匹配的最佳相似度
【发布时间】:2021-11-03 19:36:34
【问题描述】:

我有一个包含 100 万个短语的索引,我想在索引中搜索一些意大利语查询短语(这不是问题)。问题在于检索匹配的顺序:我想首先获得完全匹配,所以我将默认相似性更改为“布尔”,我认为这是一个好主意,但有时它不起作用。例如:在我的索引中搜索包含单词“film cortometraggio”的短语,第一个匹配项是:

  • Distribuito dalla General Film Company, il film- un cortometraggio in due bobine
  • Distribuito dalla General Film Company, il film - un cortometraggio di 150 metri - uscì nelle sale cinematografiche

但是有一些更好的短语应该在这些短语之前返回:

  • Robinet aviatore Robinet aviatore è un film cortometraggio del 1911 diretto da Luigi Maggi;

我认为应该首先返回最后一个短语,因为我要搜索的两个词之间没有空格。

使用 BM25 算法,我得到的第一个匹配项是“Pappi Corsicato Ha diretto film, cortometraggi, documentari e videoclip.”。在这种情况下,还应提供短语“Robinet aviatore Robinet aviatore è un film cortometraggio del 1911 diretto da Luigi Maggi;”因为是完全匹配,我不明白为什么算法会给另一个短语更高的分数。

我正在使用 Java Rest 高级客户端,我正在执行的搜索查询是简单的匹配短语查询,如下所示: searchSourceBuilder.query(QueryBuilders.matchPhraseQuery(field, text).slop(5)

这是我索引中文档的结构:

XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject();
            {
                    builder.field("id",id);
                    builder.field("frase",frase);
            }builder.endObject();
          IndexRequest indexRequest = new IndexRequest(indice);
          indexRequest.source(builder);
          IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

有谁知道如何更改相似性标准以按正确顺序检索匹配项?

【问题讨论】:

  • 你能显示你正在做的查询吗?
  • 我是在 java 上用其余的高级客户端做的(但最后是用其余的客户端或 kibana 做的)并且查询是简单的匹配短语查询
  • 1.您使用的是哪个版本的弹性搜索? 2.如果你使用DSL查询你得到相同的结果吗? 3. 我在 kibana 开发工具中使用匹配短语查询复制了你的场景,但我的第一个结果是 Robinet aviatore Robinet aviatore è un film cortometraggio del 1911 diretto da Luigi Maggi;
  • 1)我使用的是 7.0.0 版本 2)我得到了理智的结果 我没有告诉你我使用的是带有“italian”词干分析器(而不是“light_italian”)的意大利语分析器,也许这就是我们得到不同结果的原因。
  • 对不起,我用的是7.11.2版本

标签: elasticsearch


【解决方案1】:

我已经在我的环境、相同版本、相同的分析仪中复制了您的问题,但我仍然收到相同的结果。可能是 BM25 算法,其他数百万个文档影响分数。

我有一些建议可以帮助您解决问题:

  1. 不要使用全流分析仪,因为它们太 侵入性,使用精简版
  2. 您可以使用 ngram 标记器来补充光分析器
  3. 您可以创建一个布尔查询 首先匹配没有使用分析器的字段 多字段

映射示例:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "message": {
        "type": "text",
        "fields": {
          "analyzed": { 
            "type":  "text",
        "analyzer": "my_italian_analyzer"
          }
        }
      }
    }
  }
}

查询可能是这样的:

GET italian_example/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "message": {
              "query": "film cortometraggio",
              "slop": 5
            }
          }
        },
        {
          "match_phrase": {
            "message.analyzed": {
              "query": "film cortometraggio",
              "slop": 5
            }
          }
        }
      ]
    }
  }
}

【讨论】:

    【解决方案2】:

    您可以像这样使用布尔查询:

    {
      "query": {
        "bool": {
          "should": [
            {
              "match_phrase": {
                "message": {
                  "query": "film cortometraggio",
                  "slop": 5
                }
              }
            },
            {
              "match_phrase": {
                "message": "film cortometraggio"
              }
            }
          ]
        }
      }
    }
    

    在此查询中,您提升特定短语。

    【讨论】:

    • 抱歉,现在对我来说有点复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2016-11-04
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多