我在弹性搜索中过滤时遇到问题。我想过滤订单行的索引。喜欢这个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"
}
}
}
我得到了正确的结果。我做错了什么?
答案 0 :(得分:3)
您可以尝试:
GET /myindex/orderrow/_search
{
"query": {
"constant_score": {
"filter": {
"query": {
"query_string": {
"query": "7X-BogusItem"
}
}
}
}
}
}
问题是查询query_string查询而术语查询不是。在索引期间,默认分析器可能会将您的数据7X-BogusItem
转换为7x
和bogusitem
等字词。当您尝试使用术语7X-BogusItem
进行查询时,它将无效,因为您没有术语7X-BogusItem
- 您只有7x
和bogusitem
个术语。但是,执行query_string会将您的查询7X-BogusItem
转换为引擎盖下的7x
和bogusitem
条款,它会找到您想要的内容。
如果您不希望分析器转换文本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
,我们有索引词7x
和bogusitem
。