Elasticsearch регистр без подстановки с подстановочными словами - PullRequest
3 голосов
/ 21 марта 2020

поле priorityName имеет search_as_you_type dataType.

Мой вариант использования такой, будто я хочу найти в документе следующие слова: ---

  1. " "-> должен дать оба результата
  2. " ДЕЛАЕТ "-> должен дать оба результата
  3. " ты "-> должен дать оба результата
  4. " Ты " "-> должен дать оба результата
  5. " ты делаешь "(если не считать того, что ты делаешь) -> должен дать оба результата
  6. " ты "-> должен дать оба результата

Из 6 только первые 5 дают мне желаемый результат, используя multi_match. как я могу получить 6-й вариант использования, когда у нас может быть неполное слово, не начинающееся с первых символов.

Sampple docs

        "_index": "priority",
        "_type": "_doc",
        "_id": "vaCI_HAB31AaC-t5TO9H",
        "_score": 1,
        "_source": { - 
          "priorityName": "What are you doing along Let's Go out"
        }
      },
      { - 
        "_index": "priority",
        "_type": "_doc",
        "_id": "vqCQ_HAB31AaC-t5wO8m",
        "_score": 1,
        "_source": { - 
          "priorityName": "what are you doing along let's go for shopping"
        }
      }
    ]
  }

1 Ответ

1 голос
/ 21 марта 2020

Для последнего поиска re you вам нужно infix tokens, и по умолчанию он не включен в тип данных search_as_you_type. Я бы посоветовал вам создать собственный анализатор, который будет создавать инфиксные токены и позволять вам соответствовать всем вашим 6 запросам.

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

Отображение индекса

POST / infix-index

{
    "settings": {
        "max_ngram_diff": 50,
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type": "ngram",
                    "min_gram": 1,
                    "max_gram": 8
                }
            },
            "analyzer": {
                "autocomplete_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter"
                    ]
                },
                "lowercase_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "priorityName": {
                "type": "text",
                "analyzer": "autocomplete_analyzer",
                "search_analyzer": "standard" --> note this
            }
        }
    }
}

Индексировать ваши образцы документов

{
  "priorityName" : "What are you doing along Let's Go out"
}

{
  "priorityName" : "what are you doing along let's go for shopping"
}

Поисковый запрос за последние re you

{
    "query": {
        "match" : {
            "priorityName" : "re you"
        }
    }
}

И результат

"hits": [
      {
        "_index": "ngram",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.4652853,
        "_source": {
          "priorityName": "What are you doing along Let's Go out"
        }
      },
      {
        "_index": "ngram",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.4509768,
        "_source": {
          "priorityName": "what are you doing along let's go for shopping"
        }
      }

Другое запросы также вернули мне оба документа, но не включили их, чтобы сократить длину этого ответа.

Примечание: Ниже приведены некоторые важные ссылки, чтобы понять ответ в деталях.

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html

https://opster.com/elasticsearch-glossary/elasticsearch-autocomplete-troubleshooting-guide/

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

...