使用“_all”时,“停止”过滤器在Elasticsearch中的行为方式不同

时间:2014-10-28 04:51:03

标签: search elasticsearch match

我正在尝试在match中实施Elasticsearch搜索,我注意到行为不同,具体取决于我使用_all还是输入特定的字符串值作为我的查询的字段名称。

为了给出一些上下文,我使用以下设置创建了一个索引:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "stop",
            "kstem",
            "word_delimiter"
          ]
        }
      }
    }
  }
}

如果我创建的文档如下:

{
  "name": "Hello.World"
}

我使用_all执行搜索,如:

 curl -d '{"query": { "match" : { "_all" : "hello" } }}' http://localhost:9200/myindex/mytype/_search

正确匹配文档(因为我使用stop过滤器来分割点上的单词),但如果我改为执行此查询:

curl -d '{"query": { "match" : { "name" : "hello" } }}' http://localhost:9200/myindex/mytype/_search

没有返回任何内容。这怎么可能?

1 个答案:

答案 0 :(得分:1)

/myindex/mytype/_mapping发出GET,并查看您的索引是否按您认为的方式配置。这意味着,例如,查看“名称”字段是否为not_analyzed

更多信息,运行以下查询以查看name字段的实际索引方式:

{
  "query": {
    "match": {
      "name": "hello"
    }
  },
  "fielddata_fields": ["name"]
}

你应该在结果中看到类似的东西:

    "fields": {
       "name": [
          "hello",
          "world"
       ]
    }

如果您不这样做,那么您知道name字段的映射存在问题。