我在索引中有一个简单的记录
CharacterId=847
CharacterId=8
会返回结果(看起来它会分别搜索CharacterId
和8
CharacterId=
返回结果CharacterId=*
不会返回任何内容Character*
返回结果CharacterId=8*
不会返回任何内容答案 0 :(得分:4)
我会假设您的问题是“为什么弹性搜索会这样做”?为了回答这个问题,我们需要看看您的记录是如何编入索引的。假设您使用默认分析器,我们可以看到您的记录被编入两个术语characterid
和847
:
$ curl "localhost:9200/twitter/_analyze?pretty=true" -d 'CharacterId=847'
{
"tokens" : [ {
"token" : "characterid",
"start_offset" : 0,
"end_offset" : 11,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "847",
"start_offset" : 12,
"end_offset" : 15,
"type" : "<NUM>",
"position" : 2
} ]
}
现在让我们来看看你的问题:
$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
"query_string": {"query":"CharacterId=8"}
}'
{
"valid" : true,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"explanations" : [ {
"index" : "twitter",
"valid" : true,
"explanation" : "_all:characterid _all:8"
} ]
}
您是对的,此查询正在搜索术语characterid
或术语8
。术语characterid
与您记录的第一个字词匹配,然后您会得到结果。
第二个查询具有类似的效果,但它只搜索一个词characterid
。
$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
"query_string": {"query":"CharacterId="}
}'
...
"explanation" : "_all:characterid"
...
第三个查询作为通配符查询处理:
$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
"query_string": {"query":"CharacterId=*"}
}'
...
"explanation" : "_all:characterid=*"
...
如您所见,它会搜索所有以字符characterid=
开头的字词。您的索引没有任何此类条款,因此它一无所获。
第四个查询再次作为通配符查询处理:
$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
"query_string": {"query":"Character*"}
}'
...
"explanation" : "_all:character*"
...
但是,这一次,它会搜索以character
开头的字词,因此它与字词characterid
匹配。
最后一个查询类似于第三个查询:
$ curl "localhost:9200/twitter/_validate/query?explain=true&pretty=true" -d '{
"query_string": {"query":"CharacterId=8*"}
}'
...
"explanation" : "_all:characterid=8*"
...
没有以characterid=8
开头的条款,因此没有返回任何记录。
如果这不是您需要的行为,您可能要考虑根本不分析此字段,或仅使用小写分析器。