【问题标题】:Custom sorting in elastic search弹性搜索中的自定义排序
【发布时间】:2017-03-04 14:01:57
【问题描述】:

我有一些带有完成建议的弹性搜索文档。我搜索一些像 Stack 这样的值,结果如下所示:

  1. 堆栈溢出
  2. 堆栈溢出
  3. 堆栈
  4. 堆栈覆盖
  5. 堆栈溢出

我希望结果按顺序显示:

  1. 堆栈
  2. 堆栈覆盖
  3. 堆栈溢出
  4. 堆栈溢出
  5. 堆栈溢出

即,精确匹配应该放在第一位,而不是空格或特殊字符的结果。 TIA

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这完全取决于您分析所查询字符串的方式。我建议您在同一个字符串字段上应用多个分析器。以下是您想要自动完成/建议功能的“名称”字段的映射示例:

    "name": {
        "type": "string",
        "analyzer": "keyword_analyzer",
        "fields": {
            "name_ac": {
                "type": "string",
                "index_analyzer": "string_autocomplete_analyzer",
                "search_analyzer": "keyword_analyzer"
            }
        }
    }
    

    这里,keyword_analyzer 和 string_autocomplete_analyzer 是在您的索引设置中定义的分析器。下面是一个例子:

    "keyword_analyzer": {
        "type": "custom",
        "filter": [
            "lowercase"
        ],
        "tokenizer": "keyword"
    }
    
    "string_autocomplete_analyzer": {
        "type": "custom",
        "filter": [
            "lowercase"
            ,
            "autocomplete"
        ],
        "tokenizer": "whitespace"
    }
    

    这里的自动完成是一个分析过滤器:

    "autocomplete": {
        "type": "edgeNGram",
        "min_gram": "1",
        "max_gram": "10"
    }
    

    设置后,在 Elasticsearch 中搜索自动建议时,您可以使用 multiMatch 查询而不是正常的匹配查询,在这里您可以提升 multiMatch 中的各个字段。下面是java中的一个例子:

    QueryBuilders.multiMatchQuery(yourSearchString,"name^3","name_ac");
    

    您可能需要根据需要更改提升 (^3)。

    如果这仍然不能满足您的要求,您可以考虑再使用一个分析器,它根据第一个单词分析字符串并将该字段包含在 multiMatch 中。以下是此类分析器的示例:

    "first_word_name_analyzer": {
        "type": "custom",
        "filter": [
            "lowercase"
            ,
            "whitespace_merge"
            ,
            "edgengram"
        ],
        "tokenizer": "keyword"
    }
    

    使用这些分析过滤器:

    "whitespace_merge": {
        "pattern": "\s+",
        "type": "pattern_replace",
        "replacement": " "
    },
    "edgengram": {
        "type": "edgeNGram",
        "min_gram": "1",
        "max_gram": "32"
    }
    

    您可能需要对提升值进行一些试验,以便根据您的要求达到最佳结果。希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多