Elasticsearch 的新手,试图更好地理解这些查询之间的区别。据我所知,term
匹配单个术语(匹配是否需要小写?),match phrase
和 query string
匹配一串文本。
最佳答案
term
查询按原样匹配单个术语:该值未分析。
因此,它不必根据您索引的内容小写。
如果您在索引时提供了 Bennett
并且未分析该值,则以下查询将不会返回任何内容:
{
"query": {
"term" : { "user" : "bennett" }
}
}
match_phrase
如果为查询字段定义了分析器,查询将分析输入并找到符合以下条件的文档:
- 所有条款必须出现在字段中
- 它们必须与输入值具有相同的顺序
- 不得有任何中间词,即连续(可能不包括停用词,但这可能很复杂)
例如,如果您索引以下文档(对字段 foo
使用 standard
分析器):
{ "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\""
}
}
}
关于这些查询的不同选项还有很多要说的,请查看相关文档:
希望这是足够清楚的,它会有所帮助。
关于Elasticsearch: "Term"、 "Match Phrase"和 "Query String"之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26001002/