2017-08-04 101 views
1

使用their data作为一个例子,下面的URI搜索命中记录,Elasticsearch查询与Elasticsearch教程通配符

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

而下面reques搜身打记录,

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

我的回答没有帮助你吗? – sunkuet02

+0

@ sunkuet02有用,谢谢!但是这使得两种搜索方法彼此不一致(直观)。你知道我是否可以对数据库做任何事情,以便两种方法都不需要“关键字”,或者两者都需要“关键字”,也许? – Luke

+0

我已经更新了我的答案。请检查它,希望它有帮助。不要忘记加注并接受我的答案,这有助于。 – sunkuet02

回答

1

您可以通过点击以下命令来获得预期结果。该命令在您的命令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朵朵:字符串现在将映射既作为 textkeyword默认。例如,如果您索引 以下简单的文档:

{ 
    "foo": "bar" 
} 

然后下面的动态映射将被创建:

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

因此,它将既可以在foo上执行全文搜索 ,并使用foo.keyword关键字搜索和聚合 字段。

+0

你能否提供一个关于“Elasticsearch会自动将”URI查询转换为“.keyword”的正文查询的评论? – Luke

+0

@Luke,一旦我读了它。我会在几分钟内给你链接它 – sunkuet02

+0

@Luke,请你检查链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-在allow_leading_wildcard部分的query.html我想你会在这个官方博客上找到你的答案 – sunkuet02