代码之家  ›  专栏  ›  技术社区  ›  andrew

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

  •  1
  • andrew  · 技术社区  · 8 年前

    假设我有三份文件:

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

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

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

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   briarheart    8 年前

    如果您不关心区分大小写,只需使用 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
        }
      }
    }