Py学习  »  Elasticsearch

ElasticSearch放弃包含查询超集的文档

Andrew • 4 年前 • 727 次点击  

假设我有三份文件:

{ "cities": "Paris Zurich Milan" }
{ "cities": "Paris Zurich" }
{ "cities": "Zurich"}

cities 只是文本,我不使用任何自定义分析器。
我要查询包含 城市 巴黎和苏黎世都是这样,没有其他城市。所以我只想得到第二份文件。

这就是我目前正在尝试的:

{
    "query": {
        "match_phrase": {
            "cities": "Paris Zurich"
        }
     }
}

但这也会返回第一个文档。 我应该怎么做?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37954
 
727 次点击  
文章 [ 1 ]  |  最新文章 4 年前
briarheart
Reply   •   1 楼
briarheart    5 年前

如果您不关心区分大小写,只需使用 term 查询:

{
  "query": {
    "term": {
      "cities.keyword": "Paris Zurich"
    }
  }
}

它将只匹配字段的精确值。

另一方面,您可以创建自定义分析器,它仍然存储字段的确切值(就像 keyword )有一个例外:存储的值将被转换为小写,这样您就可以找到 Paris Zurich 以及 paris Zurich . 示例如下:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "lowercase_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "char_filter": [],
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "cities": {
          "type": "text",
          "fields": {
            "lowercased": {
              "type": "text",
              "analyzer": "lowercase_analyzer"
            }
          }
        }
      }
    }
  }
}

{
  "query": {
    "term": {
      "cities.lowercased": "paris zurich" // Query string should also be in lowercase
    }
  }
}