Elasti c search: частичный поиск не работает должным образом - PullRequest
2 голосов
/ 14 июля 2020

Частичный поиск не работает по нескольким полям.

Данные: - «Sales inquiries generated».

{
    "query_string": {
        "fields": ["name", "title", "description", "subject"],
        "query": search_data+"*"
    }
}
  • Случай 1: когда я передаю данные поиска как "запросы" работает нормально, но когда я передаю данные поиска как "запросы ie", они не работают.

  • Случай 2: когда я передаю данные поиска как «продажа», все работает нормально. , Но когда я передаю данные поиска как «продажи», это не работает.

  • Случай 3: когда я передаю данные поиска как «сгенерированные», он работает нормально, но когда я передаю данные поиска как « генерировать "это не работает.

Я определил свое поле таким образом.

text_analyzer = analyzer("text_analyzer", tokenizer="standard", filter=["lowercase", "stop", "snowball"])


name = Text(analyzer=text_analyzer, fields={"raw": Keyword()})
title = Text(analyzer=text_analyzer, fields={"raw": Keyword()})
subject = Text(analyzer=text_analyzer, fields={"raw": Keyword()})

В чем проблема в моем коде? Любая помощь приветствуется! Заранее спасибо.

1 Ответ

0 голосов
/ 14 июля 2020

Это происходит из-за использования фильтра токенов snowball, который определяет слова, пожалуйста, обратитесь к официальному снежному кому c для получения дополнительной информации.

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

ES предоставляет хороший API REST, и вы можете легко воспроизвести проблему:

Создайте индекс с вашими настройками

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "snowball",
                        "stop"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

после создания индекса вы можете использовать API анализа , чтобы увидеть сгенерированные токены для вашего текста.

POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze

{
  "analyzer": "my_analyzer",
  "text": "Sales inquiries generated"
}

{
    "tokens": [
        {
            "token": "sale",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "inquiri",
            "start_offset": 6,
            "end_offset": 15,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "generat",
            "start_offset": 16,
            "end_offset": 25,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

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

Обновление: Как упоминалось в комментариях, пожалуйста, предоставьте дополнительную информацию ie окончательный поиск JSON и вы отображаете в JSON, чтобы найти root c ause и следите за моим блогом о том, как реализовать частичное автозаполнение в ES.

...