我在索引中有一个简单的记录
CharacterId=847
- 查询
CharacterId=8
返回结果(看起来它分别搜索CharacterId
和8
- 查询
CharacterId=
返回结果 - 查询
CharacterId=*
不返回任何内容 - 查询
Character*
返回结果 - 查询
CharacterId=8*
不返回任何内容
我在索引中有一个简单的记录
CharacterId=847
CharacterId=8
返回结果(看起来它分别搜索CharacterId
和8
CharacterId=
返回结果CharacterId=*
不返回任何内容Character*
返回结果CharacterId=8*
不返回任何内容我会假设您的问题是“为什么 elasticsearch 这样做”?为了回答这个问题,我们需要看看您的记录是如何被索引的。假设您使用的是默认分析器,我们可以看到您的记录被索引为两个词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"
} ]
}
你是对的,这个查询正在搜索 termcharacterid
或 for the term 8
。该术语characterid
与您的记录的第一个术语匹配,您将返回结果。
第二个查询具有类似的效果,但它只搜索一个 term 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=*"
...
如您所见,它搜索所有以 characters 开头的术语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
因此不会返回任何记录。
如果这不是您需要的行为,您可能需要考虑根本不分析此字段,或者只使用小写分析器。