【问题标题】:Elasticsearch: Difference between "Term", "Match Phrase", and "Query String"Elasticsearch:“术语”、“匹配短语”和“查询字符串”之间的区别
【发布时间】:2014-11-18 00:11:58
【问题描述】:

这里是 Elasticsearch 的新手,并试图更好地理解这些查询之间的区别。据我所知,term 匹配单个术语(需要小写才能匹配?),match phrase 和 query string 都匹配一个文本字符串。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    term 查询按原样匹配单个术语:该值未分析。 因此,它不必根据您索引的内容而小写。

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

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

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

    • 所有字词必须出现在该字段中
    • 它们必须与输入值具有相同的顺序
    • 不得有任何中间词,即连续(可能不包括停用词,但这可能很复杂)

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

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

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

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

    【讨论】:

    • 伟大、精彩、透彻的解释!我唯一不清楚的是分析到底是什么或做什么......
    • 不客气 :) 分析器处理文本以获得最终被索引/搜索的术语。阅读这些pages of the ElasticSearch Definitive Guide,因为这是一个非常重要的概念。
    • 是的,来自 SQL,这里有很多新想法。查询和过滤器、精确值与全文、JSON 搜索对象之间的区别,以及弹性搜索执行其搜索的方式。有这么多要接受!感谢资源!
    • @ThomasC 如果你的索引中有 { "foo":"Hello beautiful world" },匹配查询会返回这个吗?
    • @batmaci a match 查询如果分析了字段,则使用分析器,所以是的。默认情况下,它将返回包含至少一个术语的文档(请参阅参数operator),并且顺序并不重要。
    【解决方案2】:

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

    假设,我们有数据:-

    { “姓名” : “你好”}

    现在如果我们想用 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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多