В согласованных результатах возвращается с пробелом в запросе - PullRequest
0 голосов
/ 30 августа 2018

Использование NEST.

У меня есть следующий код.

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

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

Я бы хотел, чтобы оба эти критерия

код = ФРУКТЫ 12 // с пробелом

code = FRUIT12 // без пробела

Возврат товаров 1 и 2

В настоящее время

Я получаю продукты 1 и 2, если я устанавливаю код = FRUIT 12 // с пробелом

и я получаю продукт 2, только если я установил код = FRUIT12 // без пробела

Пример данных Продукты

[
        {
            "id": 1,
            "name": "APPLE",
            "code": "FRUIT 12"
        },
        {
            "id": 2,
            "name": "ORANGE",
            "code": "FRUIT12"
        }
]

1 Ответ

0 голосов
/ 30 августа 2018

по умолчанию, строковое поле будет иметь токенайзер 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"] многотерминальный запрос.

...