您可以通过点击以下命令来获得预期结果。该命令在您的命令city
中添加一个额外的.keyword
。
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_analyze。
在第一种情况下,您使用查询参数命中了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
关键字搜索和聚合 字段。
我的回答没有帮助你吗? – sunkuet02
@ sunkuet02有用,谢谢!但是这使得两种搜索方法彼此不一致(直观)。你知道我是否可以对数据库做任何事情,以便两种方法都不需要“关键字”,或者两者都需要“关键字”,也许? – Luke
我已经更新了我的答案。请检查它,希望它有帮助。不要忘记加注并接受我的答案,这有助于。 – sunkuet02