如何在Elasticsearch中区分字符串开头的匹配优先级?

时间:2019-06-19 09:27:17

标签: elasticsearch

我有一个Elasticsearch实例,里面充满了包含电影和系列标题的文档。

运行此命令时:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "fields": [
              "Name^2",
              "SeriesName^1.5",
              "Description"
            ],
            "fuzziness": "AUTO",
            "prefix_length": 2,
            "query": "game"
          }
        }
      ]
    }
  }
}

...我得到了诸如“大游戏”,“饥饿游戏”,“战争游戏”之类的标题

但是,我希望在标题仅包含“ game”之前获得以“ game”开头的标题。

当用户搜索“游戏”时,他们希望在“模仿游戏”之前出现“权力的游戏”和“游戏改变”之类的标题。

如何使它更精确?谢谢!

1 个答案:

答案 0 :(得分:1)

尝试以下类似方法:

{ "query": {
    "prefix" : { "Name" : "game" }
  }
}

请参考同一Elasticsearch Documentation

的文档

为此,您的字段/属性必须被标记为关键字,请参见下面的查询。您还可以在映射中为您的字段/属性添加其他小写过滤器。

{
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "analyzer_startswith": {
                        "tokenizer": "keyword",
                        "filter": "lowercase"
                    }
                }
            }
        }
    },
    "mappings": {
        "test_index": {
            "properties": {
                "Name": {
                    "search_analyzer": "analyzer_startswith",
                    "index_analyzer": "analyzer_startswith",
                    "type": "string"
                }
            }
        }
    }
}