Как искать часть слова с пружинными данными упругого поиска

В моем Spring Data Elasticsearch Приложение Я хотел бы реализовать функцию автозаполнения, когда пользователь вводит несколько символов и приложение покажет ему все возможные варианты с query*,

Сейчас я не могу найти способ, как правильно реализовать его с помощью Spring Data Elasticsearch.

Например я попробовал следующее:

Criteria c = new Criteria("name").startsWith(query);
return elasticsearchTemplate.queryForPage(new CriteriaQuery(c, pageRequest), ESDecision.class);

Он работает для запроса одного слова, но в случае двух или более слов возвращает ошибку:

"Cannot constructQuery '*"security windows"'. Use expression or multiple clauses instead."

Как правильно это реализовать в этом случае?

1 ответ

Решение

У меня такое же требование, я реализовал то же самое. Querystring будет работать для вас. Если у вас есть два токена типа "окна безопасности", то вам нужно пройти "*security* *windows*" чем Querystring вернет все возможные данные. Если у вас есть один токен типа "безопасность", то вы должны передать "*security*",

Еще одно объяснение этого сценария, проверьте этот ответ - /questions/12029399/kak-iskat-chast-slova-s-elasticsearch/12029401#12029401

String aQueryString = "security windows" ;
String aQueryWithPartialSerach = null;
List<ESDecision> aESDecisions = null;


 // Enabling partial sarch
        if (aQueryString.contains(" ")) {
            List<String> aTokenList = Arrays.asList(aQueryString.split(" "));
            aQueryWithPartialSerach = String.join(" ", aTokenList.stream().map(p -> "*" + p + "*").collect(Collectors.toList()));
        } else {
            aQueryWithPartialSerach = "*" + aQueryString + "*";
        }
NativeSearchQueryBuilder aNativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        aNativeSearchQueryBuilder.withIndices(indexName).withTypes(type).withPageable(new PageRequest(0, iPageRequestCount));
        final BoolQueryBuilder aQuery = new BoolQueryBuilder();

            aQuery.must(QueryBuilders.queryStringQuery(aQueryWithPartialSerach).defaultField("name"));

  NativeSearchQuery nativeSearchQuery = aNativeSearchQueryBuilder.withQuery(aQuery).build();
        aESDecisions = elasticsearchTemplate.queryForList(nativeSearchQuery, ESDecision.class);
        return aESDecisions;

Импорт должен быть сделан:-

import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.domain.PageRequest;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
Другие вопросы по тегам