弹性搜索:"术语","匹配短语"和"查询字符串"之间的区别

ble*_*908 102 elasticsearch

这里是弹性搜索的新手,并试图更好地理解这些查询之间的差异.据我所知,term对集的一个单一期限(需小写的比赛工作吗?),都match phrasequery string文本字符串匹配.

Tho*_*asC 198

term查询匹配单个术语:不分析该值.因此,它不必是小写的,具体取决于您索引的内容.

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

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

{ "foo":"Hello world" }

{ "foo":"World Hello" }
Run Code Online (Sandbox Code Playgroud)

match_phrase查询仅返回第一个和第二个文档:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

query_string默认情况下,在_all字段上查询搜索,该字段一次包含多个文本字段的文本.最重要的是,它被解析并支持一些运算符(AND/OR ...),通配符等(参见相关语法).

作为match_phrase查询,根据查询字段上设置的分析器分析输入.

match_phrase与之不同,分析后获得的术语不必具有相同的顺序,除非用户在输入周围使用了引号.

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

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Vij*_*pta 13

我认为有些人肯定会在PARTIAL SEARCH方面寻找它们之间的差异 这里是我对默认'标准分析仪'的分析 : -

假设,我们有数据: -

{"name":"你好"}

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

术语查询或匹配查询

{"term":{"name": "*ell*" }
Run Code Online (Sandbox Code Playgroud)

不会工作,返回注意.

{"term":{"name": "*zz* *ell*" }
Run Code Online (Sandbox Code Playgroud)

不会工作,返回注意.

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

通配符查询: -

{"wildcard":{"name": "*ell*" }
Run Code Online (Sandbox Code Playgroud)

将工作给出结果{"name":"你好"}

{"wildcard":{"name": "*zz* *ell*" }
Run Code Online (Sandbox Code Playgroud)

不会工作,返回注意.

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

请求参数 :-

{"query_string": {"default_field": "name","query": "*ell*"}
Run Code Online (Sandbox Code Playgroud)

将工作给出结果{"name":"你好"}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }
Run Code Online (Sandbox Code Playgroud)

将工作给出结果{"name":"Hello"}.

结论 - query_string能够用两个令牌进行搜索

- >这里的标记是ell和zz

  • “通配符只能使用一个令牌进行部分搜索”:更准确地说,[默认情况下,“通配符”查询仅适用于“关键字”字段](https://www.elastic.co/guide/en/elasticsearch/reference /current/fielddata.html#fielddata-disabled-text-fields),根据定义是单令牌。这与字段内容超过一个单词无关。在您的通配符查询中,“ozzy hello”将匹配。 (4认同)