【问题标题】:Is there a difference between "match" and "simple_query_string" if no special characters?如果没有特殊字符,“match”和“simple_query_string”之间有区别吗?
【发布时间】:2020-09-17 11:58:16
【问题描述】:

弹性搜索 7.9

我正在搜索单个字段,其中包含通过 Web UI 向用户公开的文本框。

    {
        match: {
            body: {
                query: 'beer pretzels',
            }
        }
    }

我正在考虑是否改用simple_query_string

    {
        simple_query_string: {
          query: 'beer pretzels',
        }
    }

如果我在关键字中检测到特殊字符,我最初的想法是切换到simple_query_string。但现在我想知道为什么我会使用match

我的问题:

对于关键字不包含特殊字符的简单情况,matchsimple_query_string 之间有什么区别吗?

为什么我不会一直使用simple_query_string

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    简单查询字符串根据提供的查询返回文档 字符串,使用具有有限但容错语法的解析器。

    请参阅此以获得detailed explanation,其中指出:

    simple_query_string 查询是 query_string 查询的一个版本 更适合在暴露的单个搜索框中使用 给用户,因为它用 +/|/- 代替了 AND/OR/NOT 的使用, 分别,它丢弃查询的无效部分而不是 如果用户犯了错误,则抛出异常。

    它支持 Lucene 语法来解释文本,你可以参考这个article,它提供了关于简单查询字符串如何工作的详细信息。

    匹配查询返回与提供的文本、数字、日期匹配的文档 或布尔值。在匹配之前分析提供的文本。

    请参阅此ES documentation part 和此blog,了解匹配查询的工作原理

    我尝试使用简单查询字符串和匹配查询在下面的搜索查询中运行:

    索引数据

    {
        "content":"foo bar -baz"
    }
    

    使用简单查询字符串搜索查询:

    {
      "query": {
        "simple_query_string": {
          "fields": [ "content" ],
          "query": "foo bar -baz"
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "stof_63937563",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.5753642,      <-- note this
            "_source": {
              "content": "foo bar -baz"
            }
          }
        ]
    

    使用匹配查询的搜索查询:

    {
      "query": {
        "match": {
          "content": {
            "query": "foo bar -baz"
          }
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "stof_63937563",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.8630463,    <-- note this
            "_source": {
              "content": "foo bar -baz"
            }
          }
        ]
    

    请参考这个SO answer,它解释了multi_matchquery_string之间的区别

    【讨论】:

    • 谢谢。我对关键字不包含特殊字符的情况感兴趣。在这种情况下 match 和 simple_query_string 有什么区别吗?
    • @KevinLawrence 据我所知,使用matchsimple query string 查询不包含特殊字符的关键字时,分数不会有差异。我也在本地测试过,当我搜索"content": "foo bar baz" 时,两个查询生成的分数相同,即0.8630463
    • @KevinLawrence 请仔细阅读我更新的答案,如果它帮助您解决了您的疑问,请不要忘记投票并接受答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多