【问题标题】:Query String Query in Elasticsearch with - and *使用 - 和 * 在 Elasticsearch 中查询字符串
【发布时间】:2016-03-23 22:17:58
【问题描述】:

我对 Elasticsearch 中的 Query String Query 有疑问。我在这里写了一个 Sense 代码来复制它。

POST myindex
POST myindex/mytype
    {
        "name":"t-shirt",
        "season": "2016-3"
    }

然后我搜索:

POST myindex/_search
{
    "query": {
        "query_string": {
           "query": "2016-*",
           "fields": ["name", "season"]
        }
    }
}

或者:

POST myindex/_search
{
    "query": {
        "query_string": {
           "query": "t-shirt*"
        }
    }
}

这些查询不返回任何文档(但它应该返回索引文档),我不知道如何修复它。

我希望尽可能通用,因为这是一个示例,但我的文档有很多字段,用户可以搜索他想要的内容而不受语法限制。

【问题讨论】:

    标签: elasticsearch lucene full-text-search sense


    【解决方案1】:

    name 字段已由 standard analyzer 分析并生成两个标记,即 tshirt,正如您在以下 _analyze 查询中看到的那样

    curl -XGET localhost:9200/test/_analyze?pretty -d 't-shirt'
    {
      "tokens" : [ {
        "token" : "t",
        "start_offset" : 0,
        "end_offset" : 1,
        "type" : "<ALPHANUM>",
        "position" : 0
      }, {
        "token" : "shirt",
        "start_offset" : 2,
        "end_offset" : 7,
        "type" : "<ALPHANUM>",
        "position" : 1
      } ]
    }
    

    相反,您可以搜索shirt*,您会得到一些结果

    POST myindex/_search
    {
        "query": {
            "query_string": {
               "query": "shirt*"
            }
        }
    }
    

    【讨论】:

    • 是的,我很清楚这一点,但我无法向用户解释不要使用“t”和“-”进行搜索
    • 好的,那么您可能需要使用 whitespace analyzer 为该字段创建自定义映射,以便在空格而不是破折号处标记您的输入。
    • 空白分析器也有同样的问题
    • 不,使用空格分析器,t-shirt 被标记为t-shirt。试试curl -XGET 'localhost:9200/test/_analyze?analyzer=whitespace&amp;pretty' -d 't-shirt'
    • 是的,但是当您使用 t-shirt* 进行搜索时,也会出现同样的问题。没有文件被退回。
    【解决方案2】:

    试试wildcard query

    POST myindex/_search
    {
      "query": {
        "wildcard": {
          "season": {
            "value": "2016-*"
          }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      我使用了"analyze_wildcard": true(默认为 false),解决了在同一查询中使用 - 和 * 搜索时返回零文档的问题。

      注意:"fields": ["_all"](或不指定)和指定所有字段及其名称(例如"fields": ["name", "season"])之间存在不同的行为。在我最完整的测试中,我尝试过。

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2014-12-09
        • 2017-03-28
        • 1970-01-01
        相关资源
        最近更新 更多