Elasticsearch:" Term"," Match Phrase"和" Query String"

时间:2014-09-23 17:16:27

标签: elasticsearch

新增到Elasticsearch并尝试更好地理解这些查询之间的差异。据我所知,term匹配单个术语(匹配工作需要小写?),match phrasequery string匹配一串文字。

2 个答案:

答案 0 :(得分:174)

term查询匹配单个字词:值未分析。 因此,根据您索引的内容,它不必小写。

如果您在索引时提供Bennett并且未分析该值,则以下查询不会返回任何内容:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase查询将分析输入,如果为查询字段定义了分析器,并找到符合以下标准的文档:

  • 所有条款必须出现在字段
  • 他们必须与输入值
  • 具有相同的顺序

例如,如果您索引以下文档(使用standard分析器作为字段foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

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\""
    }
  }
}

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

希望这很清楚,它会有所帮助。

答案 1 :(得分:12)

我认为有人肯定会在 PARTIAL SEARCH 方面寻找它们之间的差异 以下是我使用默认'标准分析器的分析: -

  

假设,我们有数据: -

{“name”:“你好”}

现在如果我们想用椭圆进行部分搜索怎么办?

  

术语查询或匹配查询

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

不会起作用,请注意。

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

不会起作用,请注意。

结论 - 术语或匹配无法进行部分搜索

  

通配符查询: -

{"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能够使用两个令牌进行搜索

- >这里的标记是ell和zz