【问题标题】:Elasticsearch searching across fields with boosting and fuzzinessElasticsearch 通过增强和模糊搜索跨领域
【发布时间】:2020-08-17 18:22:53
【问题描述】:

我在 elasticsearch 中创建一个索引,我希望能够跨多个字段进行搜索,即将这些字段视为一个大搜索字段。我做了一些研究,发现了两种不同的方法:

  1. 第一个是用cross_fields 多匹配 查询。这允许将多个字段作为一个大字段进行搜索,并具有提升某些字段的能力。但不允许添加模糊性。

  2. 使用 copy_to 我可以将字段复制到“全部”字段,以便所有可搜索的术语都在一个大字段中。这允许模糊搜索,但不允许我通过特定字段来提升

是否有另一个我不知道的 cross_fields 或搜索选项可以让我进行模糊搜索以及特定字段的提升?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我认为您可以在多重匹配中添加麻烦。 但它将适用于所有领域。 在下面找到一个带有 boost 和 fuzziness 的示例

    GET /my_index/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "bjorn borg schoenen",
                "fields": [
                  "title^5.0",
                  "brand^2.0"
                ],
                "type": "best_fields",
                "operator": "and",
                "fuzziness": "auto"
              }
            }
          ]
        }
      }
    }
    

    如果您想更细化,您可以使用布尔查询与 should 和 minimum should match:

     {
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "brand": {
                      "query": "my query",
                      "fuzziness": "auto",
                      "boost": 2
                    }
                  }
                },
                {
                  "match": {
                    "title": {
                      "query": "my query",
                      "fuzziness": "auto",
                      "boost": 5
                    }
                  }
                }
              ],
              "minimum_should_match": 1
            }
          }
        }
    

    如果查询变得复杂,我可以建议您使用搜索模板来简化应用端的集成: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html

    【讨论】:

    • 如果我想在查询中搜索一个字段或另一个字段,这将起作用。例如,如果字段是名字和姓氏并且搜索“Steve”或“Jobs”,那么您的解决方案将有效。但是,如果我搜索“Steve Jobs”,multi_match best_fields 将不起作用
    • 好的,我明白你的意思,抱歉我错过了这个细节。您的问题与此类似:stackoverflow.com/questions/23916180/…。 SarZ的答案应该是您的解决方案。保持 multi_match 与 cross_field 并在摄取时进行模糊处理: - Ngram 允许您在摄取时执行部分模糊处理。 - 或者您可以使用语音字段映射在摄取时间上具有更积极的模糊性elastic.co/guide/en/elasticsearch/plugins/current/…
    猜你喜欢
    • 2021-03-27
    • 2017-12-14
    • 2020-03-17
    • 2023-03-13
    • 2019-05-24
    • 2016-01-18
    • 2020-06-18
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多