Using NEST.
我有以下代码。
QueryContainerDescriptor<ProductIndex> q
var queryContainer = new QueryContainer();
queryContainer &= q.Match(m => m.Field(f => f.Code).Query(parameters.Code));
我想同时拥有这两个标准
代码=水果 12//带空格
代码=FRUIT12//无空格
退回产品 1 和 2
现在
如果我设置代码=FRUIT 12,我会得到产品 1 和 2//带空格
如果我设置 code=FRUIT12//没有空格,我只会得到产品 2
示例数据 产品
[
{
"id": 1,
"name": "APPLE",
"code": "FRUIT 12"
},
{
"id": 2,
"name": "ORANGE",
"code": "FRUIT12"
}
]
默认情况下,字符串字段将具有standard
分词器,它将为"FRUIT12"输入发出单个标记"FRUIT12"。
您需要在字段分析器中使用word_delimiter令牌筛选器,以允许预期的行为:
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"]
多词查询。