如果查询正好是“ *”,则通配符查询仅返回结果

时间:2019-05-01 15:58:48

标签: elasticsearch

我使用的是Elasticsearch 6.7.0,我试图制作一个wildcard query,例如要选择其中字段datafile_url.RLF结尾的文档。

从简单的查询开始,我只使用通配符*来查询任何值:

GET data/_search
{
  "query": {
     "wildcard": {
        "datafile_url": "*"
     }
  }
}

这将返回文档,例如:

{
  "_index" : "data",
  "_type" : "doc",
  "_id" : "1HzJaWoBVj7X61Ih767N",
  "_score" : 1.0,
  "_source" : {
    "datafile_url" : "/uploads/data/1/MSN001.RLF",
    ...
  }
},

好的,太好了。但是,当我将通配符查询更改为*.RLF时,没有任何结果。

1 个答案:

答案 0 :(得分:1)

简短答案:这是因为当未为字段明确指定默认分析器时,弹性会应用Standard Analyzer

如果您对关键字进行通配符搜索,它将起作用并返回预期结果:

GET data/_search
{
  "query": {
     "wildcard": {
        "datafile_url.keyword": "*.RLF"
     }
  }
}

现在,有一定背景说明为什么没有.keyword就无法使用

看看这个例子,然后尝试在自己的索引上运行它。

POST data/_analyze
{
  "field": "datafile_url",
  "text" : "/uploads/data/1/MSN001.RLF"
}

#Result

{
  "tokens": [
    {
      "token": "uploads",
      "start_offset": 1,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "data",
      "start_offset": 9,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "1",
      "start_offset": 14,
      "end_offset": 15,
      "type": "<NUM>",
      "position": 2
    },
    {
      "token": "msn001",
      "start_offset": 16,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "rlf",
      "start_offset": 23,
      "end_offset": 26,
      "type": "<ALPHANUM>",
      "position": 4
    }
  ]
}

注意倒排索引中所有特殊字符的丢失方式。您的通配符搜索将仅对倒排索引中的上述任何单词起作用。例如:

#this will work
    GET data/_search
    {
      "query": {
         "wildcard": {
            "datafile_url": "*rlf"
         }
      }
    }

#this will NOT work because of case sensitive inverted index.
    GET data/_search
    {
      "query": {
         "wildcard": {
            "datafile_url": "*RLF"
         }
      }
    }

如果您想保留那些特殊字符,则需要写一个custom analyzer