我使用的是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
时,没有任何结果。
答案 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。