Как оптимизировать полнотекстовый поискasticsearch для соответствия строкам типа «C ++» - PullRequest
1 голос
/ 27 января 2020

У нас есть поисковая система для текстового содержимого, которое содержит строки типа c++ или c#. Переключение на Elasticsearch показало, что поиск не соответствует таким терминам, как «c ++». ++ удалено.

Как научить эластичному поиску корректно сопоставляться при полнотекстовом поиске, а не удалять специальные символы? Такие символы, как запятая ,, конечно же, должны быть удалены.

1 Ответ

0 голосов
/ 27 января 2020

Вам нужно создать свой собственный пользовательский анализатор , который генерирует токен в соответствии с вашими требованиями, для вашего примера я создал пользовательский анализатор ниже с именем текстового поля language и проиндексировал некоторые примеры документов:

Создание индекса с помощью пользовательского анализатора

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "whitespace",
                    "char_filter": [
                        "replace_comma"
                    ]
                }
            },
            "char_filter": {
                "replace_comma": {
                    "type": "mapping",
                    "mappings": [
                        ", => \\u0020"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "language": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

Токены, сгенерированные для текста, такого как c++, c# и c,java.

POST http: // {{{ hostname}}: {{port}} / {{index}} / _ анализ

{
  "text" : "c#",
  "analyzer": "my_analyzer"
}

{
    "tokens": [
        {
            "token": "c#",
            "start_offset": 0,
            "end_offset": 2,
            "type": "word",
            "position": 0
        }
    ]
}

для c,java он сгенерировал 2 отдельных токена c и java, заменив , пробелами показано ниже:

{
  "text" : "c, java",
  "analyzer":"my_analyzer"
}

{
    "tokens": [
        {
            "token": "c",
            "start_offset": 0,
            "end_offset": 1,
            "type": "word",
            "position": 0
        },
        {
            "token": "java",
            "start_offset": 3,
            "end_offset": 7,
            "type": "word",
            "position": 1
        }
    ]
}

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

...