Elasticsearch query_string按其条款搜索复杂关键字

时间:2017-07-21 09:17:16

标签: elasticsearch

现在,我知道关键字不应该包含非结构化文本,但是我们可以说,由于某些原因,这样的文本被写入关键字字段。 当使用匹配或术语查询搜索此类文档时,找不到该文档,但是当使用query_string搜索时,通过部分匹配(内部关键字中的“术语”)找到该文档。我不明白当Elasticsearch的文档明确指出关键字按原样反向索引时,如果没有术语标记化,这是怎么回事。 例: 我的索引映射:

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "full_text": {
          "type":  "text" 
        },
        "exact_value": {
          "type":  "keyword" 
        }
      }
    }
  }
}

然后我把文件放在:

PUT my_index/my_type/2
{
  "full_text":   "full text search", 
  "exact_value": "i want to find this trololo!"  
}

想象一下,当我按关键字术语获得文档时,我感到惊讶,而不是完全匹配:

GET my_index/my_type/_search
{
  "query": {
    "match": {
      "exact_value": "trololo" 
    }
  }
}

- 没有结果;

GET my_index/my_type/_search
{
  "query": {
    "term": {
      "exact_value": "trololo" 
    }
  }
}

- 没有结果;

POST my_index/_search
{"query":{"query_string":{"query":"trololo"}}}

- 我的文件被退回(!):

       "hits": {
      "total": 1,
      "max_score": 0.27233246,
      "hits": [
         {
            "_index": "my_index",
            "_type": "my_type",
            "_id": "2",
            "_score": 0.27233246,
            "_source": {
               "full_text": "full text search",
               "exact_value": "i want to find this trololo!"
            }
         }
      ]
   }

1 个答案:

答案 0 :(得分:2)

当您在弹性上执行query_string查询时,如下所示

POST index/_search
{
    "query": {
        "query_string": {
            "query": "trololo"
        }
    }
}

这实际上是对_all字段进行搜索,如果你没有提及,则用标准分析仪进行弹性分析。

如果您在查询中指定字段,则不会获得关键字字段的记录。

POST my_index/_search
{
  "query": {
    "query_string": {
      "default_field": "exact_value", 
      "query": "field"
    }
  }
}