es проблема с нечетким запросом
Когда я сегодня столкнулся с es-запросом, я столкнулся с трудностью, и поиск причины проблемы занял много времени.
Требование: реализовать нечеткий запрос. Эквивалентно % like % в sql. Однако в процессе разработки я использовал различные сегментации слов и различные коды запросов, чего всегда было невозможно достичь.
проблема:
Например: я могу запросить нарезанный хлеб, но не могу запросить нарезанный хлеб.
Причина в том, что es по умолчанию использует механизм сегментации слов, поэтому, когда я запрашиваю, нарезанный хлеб не помещается в сегментацию слов и не может быть запрошен.
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
// Iterable<Commodity> iterable = commodityRepository.search(matchQueryBuilder);
// Iterable<Commodity> iterable = commodityRepository.search(matchQueryBuilder);
// iterable.forEach(e->list.add(e));
После запроса данных я тестирую следующий код:
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*"+name+"*");
Iterable<Commodity> iterable = commodityRepository.search(wildcardQueryBuilder);
Проверил, все равно не работает. Депрессия.
токенизатор поля
Затем я добавляю токенизатор в атрибут поля. Сначала удалите данные на es, а потом заново вставьте данные.
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title; //标题
После тестирования двух приведенных выше кодов по-прежнему невозможно запросить данные о нарезанном хлебе.
Наконец, я пытаюсь удалить весь индекс и повторно вставить данные для проверки.
DELETE /commodity
Вся команда — это команда удаления индекса в кибабе. Затем я установил ключевое слово в свойствах поля:
@Field(type = FieldType.Keyword)
private String name;
Затем повторно вставьте данные и выполните нечеткий код запроса:
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "*"+name+"*");
Iterable<Commodity> iterable = commodityRepository.search(wildcardQueryBuilder);
Произошло чудо, и оно сработало. Независимо от того, что я запрашиваю, пока это включено, его можно запросить. Наконец-то решил эту проблему, наконец-то полегчало.
Суммировать
При изменении атрибутов указателя (документа) исходный атрибут был текстовым, а позже изменился на ключевое слово. Поэтому необходимо сначала удалить чистый индекс, повторно вставить данные и выполнить нечеткий запрос. Моя причина в том, что индекс не удаляется. Обязательно не забудьте перегенерировать индекс, чтобы добиться эффекта нечеткого запроса.