在查询中返回带有空格的一致结果

问题描述 投票:0回答:1

使用NEST。

我有以下代码。

QueryContainerDescriptor<ProductIndex> q
var queryContainer = new QueryContainer();

queryContainer &= q.Match(m => m.Field(f => f.Code).Query(parameters.Code));

I would like to have both these criteria

code = FRUIT 12 //带空格

code = FRUIT12 //没有空格

退货1和2

Currently

如果我用空格设置code = FRUIT 12 //,我会得到产品1和2

如果我设置代码= FRUIT12 //没有空格我只得到产品2

样本数据产品

[
        {
            "id": 1,
            "name": "APPLE",
            "code": "FRUIT 12"
        },
        {
            "id": 2,
            "name": "ORANGE",
            "code": "FRUIT12"
        }
]
elasticsearch nest
1个回答
0
投票

默认情况下,字符串字段将具有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"]多项查询。

© www.soinside.com 2019 - 2024. All rights reserved.