0

我在索引中有一个简单的记录

CharacterId=847 
  • 查询CharacterId=8返回结果(看起来它分别搜索CharacterId8
  • 查询CharacterId=返回结果
  • 查询CharacterId=*不返回任何内容
  • 查询Character*返回结果
  • 查询CharacterId=8*不返回任何内容
4

1 回答 1

4

我会假设您的问题是“为什么 elasticsearch 这样做”?为了回答这个问题,我们需要看看您的记录是如何被索引的。假设您使用的是默认分析器,我们可以看到您的记录被索引为两个词characterid847

$ 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因此不会返回任何记录。

如果这不是您需要的行为,您可能需要考虑根本不分析此字段,或者只使用小写分析器。

于 2012-07-26T14:31:50.723 回答