如何使用弹性搜索搜索其中带有“ - ”破折号的值

时间:2014-12-12 12:17:37

标签: elasticsearch

我在弹性搜索中的条目是这样的:

输入:

curl -XPUT "http://localhost:9200/movies/movie/4" -d'
{
     "uid": "a-b"
}'

查询:

curl -XGET "http://localhost:9200/movies/movie/_search" -d '
{
    "query" : {
        "term" : { "uid": "a-b" }
    }
}'

输出:

{"took":2,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}

谢谢

1 个答案:

答案 0 :(得分:3)

完全取决于您使用的分析仪。

使用标准分析仪,您可以看到已生成两个令牌,并且" - "被忽略了。

curl -XGET 'localhost:9200/myindex/_analyze?analyzer=standard&pretty' -d 'a-b'
{
  "tokens" : [ {
        "token" : "a",
        "start_offset" : 0,
        "end_offset" : 1,
        "type" : "<ALPHANUM>",
        "position" : 1
  }, {
        "token" : "b",
        "start_offset" : 2,
        "end_offset" : 3,
        "type" : "<ALPHANUM>",
        "position" : 2
  } ]
}

使用空白分析仪&#34; - &#34;被视为数据,您只能为您的数据获取一个令牌:

curl -XGET 'localhost:9200/myindex/_analyze?analyzer=whitespace&pretty' -d 'a-b'
{
  "tokens" : [ {
        "token" : "a-b",
        "start_offset" : 0,
        "end_offset" : 3,
        "type" : "word",
        "position" : 1
  } ]
}

使用 term 查询时,不会对搜索查询进行分析。 所以你可能想要匹配&#34; a-b&#34;反对&#34; a&#34;和&#34; b&#34; (假设您在映射中使用了标准分析器) - 即它不匹配并且不会返回结果。

如果您在查询中使用了匹配 query_string ,则搜索可能会起作用,因为搜索字符串已被分析。 即ES会尝试匹配&#34; a&#34;和&#34; b&#34;对包含&#34; a&#34;的字段和&#34; b&#34; - 这将是一场成功的比赛。