разрывы строк или знаки препинания в качестве зазоров положения в elasticsearch

в elasticsearch есть ли способ настроить анализатор, который будет создавать зазоры между маркерами при обнаружении разрывов строк или знаков препинания?

предположим, я индексирую объект со следующей бессмысленной строкой (с разрывом строки) в качестве одного из его полей:

The quick brown fox runs after the rabbit.
Then comes the jumpy frog.

стандартный анализатор выдаст следующие токены с соответствующими позициями:

0 the
1 quick
2 brown
3 fox
4 runs
5 after
6 the
7 rabbit
8 then
9 comes
10 the
11 jumpy
12 frog

это означает, что a match_phrase запрос the rabbit then comes будет соответствовать этому документу как хит. Есть ли способ, чтобы ввести пробел между rabbit и then так что он не соответствует, если - это?

конечно, обходным путем может быть преобразование одной строки в массив (одна строка на запись) и использование position_offset_gap в отображении полей, но я бы предпочел сохранить одну строку с новыми строками (и окончательное решение будет включать большие пробелы в позициях для новых строк, чем, скажем, для знаков препинания).

1 ответов


Я в конце концов понял решение, используя char_filter чтобы ввести дополнительные токены на разрывы строк и знаки препинания:

PUT /index
{                                              
  "settings": {
    "analysis": {
      "char_filter": {
        "my_mapping": {
          "type": "mapping",
          "mappings": [ ".=>\n_PERIOD_\n", "\n=>\n_NEWLINE_\n" ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": ["my_mapping"],
          "filter": ["lowercase"]
        }
      }
    }
  }
}

тестирование с помощью примера string

POST /index/_analyze?analyzer=my_analyzer&pretty
The quick brown fox runs after the rabbit.
Then comes the jumpy frog.

дает следующий результат:

{
  "tokens" : [ {
    "token" : "the",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
... snip ...
    "token" : "rabbit",
    "start_offset" : 35,
    "end_offset" : 41,
    "type" : "<ALPHANUM>",
    "position" : 8
  }, {
    "token" : "_period_",
    "start_offset" : 41,
    "end_offset" : 41,
    "type" : "<ALPHANUM>",
    "position" : 9
  }, {
    "token" : "_newline_",
    "start_offset" : 42,
    "end_offset" : 42,
    "type" : "<ALPHANUM>",
    "position" : 10
  }, {
    "token" : "then",
    "start_offset" : 43,
    "end_offset" : 47,
    "type" : "<ALPHANUM>",
    "position" : 11
... snip ...
  } ]
}