【问题标题】:Elasticsearch: prefer prefix match over term matchElasticsearch:更喜欢前缀匹配而不是术语匹配
【发布时间】:2021-03-06 15:33:28
【问题描述】:

我在 elasticsearch 索引中有一个字段,我正在尝试在其中进行搜索,并且我希望该字段的值以搜索词开头的文档高于该词在某处的文档在一个长短语的中间。例如。: 搜索“lorem”时,

{
  "title": "Lorem"
}

应该有更高的分数

{
  "title": "The time I said Lorem"
}

{
  "title": "The Lorem"
}

甚至

{
  "title": "Lorem impsum"
}

但是,简单的matchmatch_phrase_prefixquery_string 查询通常不是这种情况。

到目前为止,我已经尝试将 prefix 查询与 match 查询结合起来,同时提升前缀,但提升​​似乎没有像我预期的那样工作,即结果相同,只是提升了 10

...
{
    "should": [
        {
            "prefix": {
                "title": {
                    "value": query,
                    "boost": 10
                }
            }
        }
        {
            "match": {
                "title": {
                    "query":     query,
                    "boost":     3,
                    "fuzziness": "AUTO"
                }
            }
        }
    ]
}
...

另外,不确定这是否相关,但 title 字段实际上是嵌套的,即 alternative_names.title

弹性搜索有什么优雅的解决方案吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用组合bool/should 子句来实现您需要的结果。

    添加一个工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "alternative_names": {
            "type": "nested",
            "properties": {
              "title": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    索引数据:

    {
      "alternative_names": {
        "title": "Lorem"
      }
    }
    {
      "alternative_names": {
        "title": "The time I said Lorem"
      }
    }
    {
      "alternative_names": {
        "title": "The Lorem"
      }
    }
    {
      "alternative_names": {
        "title": "Lorem impsum"
      }
    }
    

    搜索查询:

    {
      "query": {
        "nested": {
          "path": "alternative_names",
          "query": {
            "bool": {
              "should": [
                {
                  "term": {
                    "alternative_names.title.keyword": "Lorem"
                  }
                },
                {
                  "match": {
                    "alternative_names.title": "Lorem"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "66500753",
            "_type": "_doc",
            "_id": "1", 
            "_score": 1.3436072,
            "_source": {
              "alternative_names": {          // note this
                "title": "Lorem"
              }
            }
          },
          {
            "_index": "66500753",
            "_type": "_doc",
            "_id": "4",
            "_score": 0.11474907,
            "_source": {
              "alternative_names": {
                "title": "Lorem impsum"
              }
            }
          },
          {
            "_index": "66500753",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.11474907,
            "_source": {
              "alternative_names": {
                "title": "The Lorem"
              }
            }
          },
          {
            "_index": "66500753",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.07477197,
            "_source": {
              "alternative_names": {
                "title": "The time I said Lorem"
              }
            }
          }
        ]
    

    【讨论】:

    • @sveatlo 你有机会看我的回答吗,期待得到你的反馈
    • 不幸的是,这似乎不适用于我数据集中的某些用例。搜索“hlava”时,结果按以下顺序排列:["Mluvící hlava","Zebří hlava","Hlava Medúzy (8)","Hlava Medúzy (8)","Hlava Medúzy (8)","Hlava Medúzy (8)","Těžká je hlava...","Těžká je hlava...","Těžká je hlava...","Hlava v kontejneru"], which doesn't seem right。我希望“Hlava meduzy (8)”是第一名。
    • 您能解释一下为什么我最初尝试提升前缀查询的方法不起作用吗?
    • 我发现问题出在我的数据集中,其中一些标题被多次索引,从而降低了术语的权重。我使用自定义脚本相似性解决了它,它就像魅力一样工作
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多