Elasticsearch: “ Term”、“ Match Phrase”和“ Query String”之间的区别

初到 Elasticsearch,试图更好地理解这些查询之间的区别。据我所知,term匹配一个术语(匹配是否需要小写?),match phrasequery string都匹配一个文本字符串。

111247 次浏览

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查询搜索。最重要的是,它被解析并支持一些操作符(AND/OR...)、通配符等(参见 相关的句法)。

match_phrase查询时,根据查询字段上的分析器集对输入进行分析。

match_phrase不同,分析后获得的术语不必按相同的顺序排列,除非用户在输入前后使用了引号。

例如,使用与前面相同的文档,此查询将返回所有文档:

{
"query": {
"query_string": {
"query": "hello World"
}
}
}

但是这个查询将返回与 match_phrase查询相同的两个文档:

{
"query": {
"query_string": {
"query": "\"Hello World\""
}
}
}

关于这些查询的不同选项还有很多要说的,请看一下相关文档:

希望这一点足够清楚,这将有所帮助。

我认为有些人肯定寻找他们之间的差异,就 部分搜索 以下是我对默认 ‘标准分析仪’的分析:-

假设,我们有数据:-

{“ name”: “ Hello”}

现在如果我们想用 ell? ? ? 进行部分搜索会怎样?

字词查询或匹配查询

{"term":{"name": "*ell*" }

没用的,没有回音。

{"term":{"name": "*zz* *ell*" }

没用的,没有回音。

结论 -Term 或 Match 根本不能进行部分搜索

通配符查询:-

{"wildcard":{"name": "*ell*" }

将工作给出结果{“ name”: “ Hello”}

{"wildcard":{"name": "*zz* *ell*" }

没用的,没有回音。

结论 -通配符只能用一个令牌进行部分搜索

Query _ string:-

{"query_string": {"default_field": "name","query": "*ell*"}

将工作给出结果{“ name”: “ Hello”}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

将工作给出结果{“ name”: “ Hello”}。

结论给出了 -query _ string 能够用两个标记进行搜索的结论

- > 这里 Token 是 Ell 和 zz