使用NEST。
我有以下代码。
QueryContainerDescriptor<ProductIndex> q
var queryContainer = new QueryContainer();
queryContainer &= q.Match(m => m.Field(f => f.Code).Query(parameters.Code));
code = FRUIT 12 //带空格
code = FRUIT12 //没有空格
退货1和2
如果我用空格设置code = FRUIT 12 //,我会得到产品1和2
如果我设置代码= FRUIT12 //没有空格我只得到产品2
样本数据产品
[
{
"id": 1,
"name": "APPLE",
"code": "FRUIT 12"
},
{
"id": 2,
"name": "ORANGE",
"code": "FRUIT12"
}
]
默认情况下,字符串字段将具有standard
标记器,它将为“FRUIT12”输入发出单个标记“FRUIT12”。
您需要在现场分析仪中使用word_delimiter token filter来实现您期望的行为:
GET _analyze
{
"text": "FRUIT12",
"tokenizer": "standard"
}
给
{
"tokens": [
{
"token": "FRUIT12",
"start_offset": 0,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 0
}
]
}
-----------和
GET _analyze
{
"text": "FRUIT12",
"tokenizer": "standard",
"filters": ["word_delimiter"]
}
给
{
"tokens": [
{
"token": "FRUIT",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "12",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
}
]
}
如果在字段上添加word_delimiter标记过滤器,则此字段上的任何搜索查询也将启用word_delimiter标记过滤器(除非您使用映射中的search_analyzer选项覆盖它)
所以"FRUIT12"
单项查询将被“翻译”为["FRUIT", "12"]
多项查询。