ElasticSearch搜索查询分隔符

时间:2012-07-26 08:01:39

标签: full-text-search elasticsearch

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

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

1 个答案:

答案 0 :(得分:4)

我会假设您的问题是“为什么弹性搜索会这样做”?为了回答这个问题,我们需要看看您的记录是如何编入索引的。假设您使用默认分析器,我们可以看到您的记录被编入两个术语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"
  } ]
}

您是对的,此查询正在搜索术语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开头的条款,因此没有返回任何记录。

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