es проблема с нечетким запросом

Архитектура

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);

Произошло чудо, и оно сработало. Независимо от того, что я запрашиваю, пока это включено, его можно запросить. Наконец-то решил эту проблему, наконец-то полегчало.

Суммировать

При изменении атрибутов указателя (документа) исходный атрибут был текстовым, а позже изменился на ключевое слово. Поэтому необходимо сначала удалить чистый индекс, повторно вставить данные и выполнить нечеткий запрос. Моя причина в том, что индекс не удаляется. Обязательно не забудьте перегенерировать индекс, чтобы добиться эффекта нечеткого запроса.

Вышеупомянутое содержание является моим собственным мнением, приветствую всех, кто дает критику и рекомендации, мы обсудим вместе!