【发布时间】:2014-11-18 00:11:58
【问题描述】:
这里是 Elasticsearch 的新手,并试图更好地理解这些查询之间的区别。据我所知,term 匹配单个术语(需要小写才能匹配?),match phrase 和 query string 都匹配一个文本字符串。
【问题讨论】:
标签: elasticsearch
这里是 Elasticsearch 的新手,并试图更好地理解这些查询之间的区别。据我所知,term 匹配单个术语(需要小写才能匹配?),match phrase 和 query string 都匹配一个文本字符串。
【问题讨论】:
标签: elasticsearch
term 查询按原样匹配单个术语:该值未分析。
因此,它不必根据您索引的内容而小写。
如果您在索引时提供了Bennett 并且未分析该值,则以下查询将不会返回任何内容:
{
"query": {
"term" : { "user" : "bennett" }
}
}
match_phrase 查询将分析输入,如果为查询字段定义了分析器并找到符合以下条件的文档:
例如,如果您索引以下文档(使用 standard 分析器对字段 foo):
{ "foo":"I just said hello world" }
{ "foo":"Hello world" }
{ "foo":"World Hello" }
{ "foo":"Hello dear world" }
这个match_phrase 查询只会返回第一个和第二个文档:
{
"query": {
"match_phrase": {
"foo": "Hello World"
}
}
}
query_string 查询搜索,默认情况下,在 _all 字段上同时包含多个文本字段的文本。最重要的是,它被解析并支持一些运算符(AND/OR...)、通配符等(参见related syntax)。
match_phrase 查询时,根据查询字段上设置的分析器对输入进行分析。
与match_phrase 不同,分析后获得的术语不必按照相同的顺序排列,除非用户在输入周围使用了引号。
例如,使用与之前相同的文档,此查询将返回所有文档:
{
"query": {
"query_string": {
"query": "hello World"
}
}
}
但此查询将返回与 match_phrase 查询相同的 2 个文档:
{
"query": {
"query_string": {
"query": "\"Hello World\""
}
}
}
关于这些查询的不同选项还有很多要说的,请查看相关文档:
希望这足够清楚,它会有所帮助。
【讨论】:
match 查询如果分析了字段,则使用分析器,所以是的。默认情况下,它将返回包含至少一个术语的文档(请参阅参数operator),并且顺序并不重要。
我认为有人肯定会在 PARTIAL SEARCH 方面寻找它们之间的差异 这是我使用默认 ‘标准分析器’ 的分析:-
假设,我们有数据:-
{ “姓名” : “你好”}
现在如果我们想用 ell 进行部分搜索呢?
词条查询或匹配查询
{"term":{"name": "*ell*" }
行不通,回帖。
{"term":{"name": "*zz* *ell*" }
行不通,回帖。
结论 - 术语或匹配根本无法进行部分搜索
通配符查询:-
{"wildcard":{"name": "*ell*" }
会给出结果 { "name" : "Hello"}
{"wildcard":{"name": "*zz* *ell*" }
行不通,回帖。
结论 - 通配符只能用一个标记进行部分搜索
查询字符串:-
{"query_string": {"default_field": "name","query": "*ell*"}
会给出结果 { "name" : "Hello"}
{"query_string": {"default_field": "name","query": "*zz* *ell*" }
会给出结果 { "name" : "Hello"} .
结论 - query_string 能够搜索给定的两个标记
-> 这里的记号是 ell 和 zz
【讨论】:
wildcard is able to do partial search with one token only:更准确地说,wildcard queries by default work only on keyword fields,根据定义是单令牌。这与字段内容超过一个单词无关。在您的通配符查询中,“ozzy hello”将匹配。