弹性搜索中的自定义排序

时间:2017-03-03 16:26:51

标签: elasticsearch

我在弹性搜索中有一些文档,带有完成建议器。我搜索像Stack这样的值,结果按以下顺序显示:

  1. Stack Overflow
  2. 堆栈上溢
  3. 堆栈
  4. StackOver
  5. 的StackOverflow
  6. 我希望结果按顺序显示:

    1. 堆栈
    2. StackOver
    3. 的StackOverflow
    4. Stack Overflow
    5. 堆栈上溢
    6. 即,应该首先匹配精确匹配而不是空格或特殊字符的结果。 TIA

1 个答案:

答案 0 :(得分:1)

这一切都取决于您分析要查询的字符串的方式。我建议你在同一个字符串字段上应用多个分析器。下面是" name"的映射示例。您想要自动完成/建议功能的字段:

"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"
}

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