弹性搜索过滤的问题

时间:2014-03-28 17:04:06

标签: elasticsearch

我在弹性搜索中过滤时遇到问题。我想过滤订单行的索引。喜欢这个SQL查询:

SELECT * FROM orderrow WHERE item_code = '7X-BogusItem'

这是我的弹性搜索查询:

GET /myindex/orderrow/_search
{
    "query": {
        "constant_score": {
           "filter": {
               "term": {
                  "item_code": "7X-BogusItem"
               }
           }
        }
    }
}

我没有得到任何结果。然而,当我运行此查询时:

GET /myindex/orderrow/_search
{
    "query": {
        "query_string": {
            "query": "7X-BogusItem"
        }
    }
}

我得到了正确的结果。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您可以尝试:

GET /myindex/orderrow/_search
{
    "query": {
        "constant_score": {
           "filter": {
               "query": {
                  "query_string": {
                      "query": "7X-BogusItem"
                   }
               }
           }
        }
    }
}

问题是查询query_string查询而术语查询不是。在索引期间,默认分析器可能会将您的数据7X-BogusItem转换为7xbogusitem等字词。当您尝试使用术语7X-BogusItem进行查询时,它将无效,因为您没有术语7X-BogusItem - 您只有7xbogusitem个术语。但是,执行query_string会将您的查询7X-BogusItem转换为引擎盖下的7xbogusitem条款,它会找到您想要的内容。

如果您不希望分析器转换文本7X-BogusItem,则可以将字段item_code的映射选项更改为"index" : "not_analyzed"

您可以在分析后检查数据的样子:

curl -XGET "localhost:9200/_analyze?analyzer=standard&pretty" -d '7X-BogusItem'
{
  "tokens" : [ {
    "token" : "7x",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "bogusitem",
    "start_offset" : 3,
    "end_offset" : 12,
    "type" : "<ALPHANUM>",
    "position" : 2
  } ]
}

因此,对于文字7X-BogusItem,我们有索引词7xbogusitem