Elasticsearch:“术语”,“匹配短语”和“查询字符串”之间的区别


116

Elasticsearch的新功能,试图更好地了解这些查询之间的差异。据我所知,term匹配单个项(需要小写的比赛工作?),都match phrasequery string文本字符串匹配。

Answers:


226

term查询匹配单个术语:不分析值。因此,不必根据所索引的内容将其小写。

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

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

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

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

例如,如果您索引以下文档(standard在字段中使用Analyzer 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 ...),通配符等(请参阅相关语法)。

作为match_phrase查询,将根据在查询字段上设置的分析器来分析输入。

不同于match_phrase,除非用户在输入周围使用引号,否则分析后获得的术语不必具有相同的顺序。

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

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

但是此查询将返回与查询相同的2个文档match_phrase

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

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

希望这足够清楚,将对您有所帮助。


精彩,精彩,透彻的解释!我唯一不清楚的是分析到底是什么或在做什么……
blee908

1
欢迎您:)分析人员处理文本,以获得最终被索引/搜索的术语。阅读《 ElasticSearch最终指南》的这些页面,因为这是一个非常重要的概念。
ThomasC 2014年

1
是的,来自SQL,这里有很多新想法。查询和过滤器,精确值与全文,JSON搜索对象以及弹性搜索执行其搜索方式之间的区别。这么多!感谢您的资源!
blee908

1
@ThomasC如果索引中包含{“ foo”:“ Hello beautiful world”},匹配查询将返回此值吗?
batmaci

1
@batmaci match如果对字段进行了分析,则查询将使用分析器,因此可以。默认情况下,它将返回具有至少一个术语(请参阅参数operator)的文档,并且顺序并不重要。
ThomasC

17

我认为有人肯定会在部分搜索方面寻找它们之间的差异 这是我使用默认“标准分析仪”进行的分析 :-

假设我们有数据:

{“ name”:“ Hello”}

现在,如果我们想对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默认情况下keyword查询仅对定义为单令牌的field 起作用。这与字段内容不止一个单词无关。在通配符查询中,“ ozzy hello”将匹配。
与莫妮卡·索克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.