在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。
答案 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
:现在将字符串映射为 默认情况下为text
和keyword
。例如,如果你索引 以下简单文件:
{
"foo": "bar"
}
然后将创建以下动态映射:
{
"foo": {
"type" "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
因此,可以执行全文搜索 关于foo,以及使用
foo.keyword
的关键字搜索和聚合 字段。