【问题标题】:Elasticsearch sort by text field keywordElasticsearch 按文本字段关键字排序
【发布时间】:2022-02-04 12:35:28
【问题描述】:

我有这个设置的索引

"analysis": {
  "filter": {
    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": 1,
      "max_gram": 10
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter",
        "asciifolding",
        "elision",
        "standard"
      ]
    },
    "autocomplete_search": {
      "tokenizer": "lowercase"
    }
  },
  "tokenizer": {
    "autocomplete": {
      "type": "edge_ngram",
      "min_gram": "3",
      "max_gram": "32"
    }
  }
}

并具有名称字段的映射

"name": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "autocomplete_search",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }

现在我有几个文档中的名称示例。 Name 是一个包含名字和姓氏的字段。

  1. --макс---
  2. -макс-
  3. {某事} макс
  4. макс {某事}

我正在使用此查询以按字母排序查找具有该名称的文档

{
  "query": {
    "match": {
      "name": {
        "query": "макс",
        "operator" : "and"
      }
    }
  },
    "sort": [
        {"name.keyword" : "asc"}
    ]
}

正如我所写的那样,它带来了结果。但我希望 макс {something} 会比其他人排在第一位,因为它是从我写的查询开始的。

有人可以帮忙吗

【问题讨论】:

    标签: sorting elasticsearch filter


    【解决方案1】:

    所以query 默认情况下是根据“它们的匹配程度”对文档进行评分,该分数用于将“最佳匹配优先”排名。但是,一旦您定义了sort,您就是说忽略查询分数,只使用该字段对结果进行排名。现在结果仍然仅限于与查询匹配的文档,但最佳匹配的想法已经丢失,除非您在排序语句中的某处保留特殊值 _score

    像这样:

    "sort": [
        {
          "productLine.keyword": {
            "order": "desc"
          }
        },
        {
          "_score": {
            "order": "desc"
          }
        }
      ]
    

    也许您可以删除排序并根据默认分数排序获得所需的结果。如果您需要来自 SO 社区的更多支持,请包含一些示例文档以使其完全可重现

    【讨论】:

    • 我试过了,但对我没有帮助。你知道我的问题是什么,例如我用字段“kirakosyan ar”搜索它首先带来结果“arthur kirakosyan”然后是“kirakosyan arthur”,因为当我得到结果时显示相同的分数
    • 您是否尝试过使用match_phrase_prefix 查询?
    • 是的,但这不是我想要的,因为在我的示例中,我也希望 arthur kirakosyan 结果
    猜你喜欢
    • 2018-11-15
    • 2017-04-25
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多