带有通配符的Elasticsearch查询

时间:2017-08-04 20:31:59

标签: elasticsearch

在Elasticsearch教程中使用their data作为示例,以下uri搜索点击 9 记录,

curl -XGET 'remotehost:9200/bank/_search?q=city:R*d&_source_include=city&pretty&pretty'

当以下请求体搜索命中 0 记录时,

curl -XGET 'remotehost:9200/bank/_search?pretty' -H 'Content-Type: application/json' 
 -d'{"query": {"wildcard": {"city": "R*d"} },
 "_source": ["city"]
}
'

但这两种方法应该相互对等。知道为什么会这样吗?我在docker中使用Elasticsearch 5.5.1。

1 个答案:

答案 0 :(得分:1)

您可以点击以下命令获得预期结果。此命令在字段.keyword中使用您的命令添加额外的city

curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'{"query": {"wildcard": {"city.keyword": "R*d"} }, "_source": ["city"]}'

添加.keyword

的原因

当您向elasticsearch插入数据时,您会注意到.keyword字段,该字段为not_analyzed。默认情况下,您已插入数据的字段是标准分析的,并且存在多字段.keyword。如果您使用数据创建字段city,则会使用标准分析器创建字段city,并添加.keyword的多字段not_analyzed

在您的情况下,您需要not_analyzed字段来查询(作为wildcard查询)。因此,您的查询应位于city.keyword字段,默认情况下为not_analyzed。

在第一种情况下,您已使用查询参数向elasticsearch发出获取请求。 Elasticsearch会自动将查询转换为第二种格式。

要获得可靠的来源,您可以按照Official docs

进行操作
  

string字段已拆分为两种新类型:text,应为   用于全文搜索,keyword,应该用于   关键字搜索。

     

为了让事情变得更好,Elasticsearch决定借用一个想法   最初源自Logstash:现在将字符串映射为   默认情况下为textkeyword。例如,如果你索引   以下简单文件:

{
  "foo": "bar"
}
  

然后将创建以下动态映射:

{
  "foo": {
    "type" "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}
  

因此,可以执行全文搜索   关于foo,以及使用foo.keyword的关键字搜索和聚合   字段。