Springboot + Hibernate с ElasticSearch: безрезультатно - PullRequest
0 голосов
/ 20 января 2020

Я хочу включить поиск группы полей для одной из моих сущностей. Поэтому я добавил hibernate-поиск в свой весенний загрузочный проект. Когда я загружаю данные в базу данных, я вижу, что Elasticsearch содержит эти данные, как и ожидалось, в индексе, работающем с

curl localhost:9200/myindex/_search?pretty

. Я могу выполнять запросы типа

curl localhost:9200/myindex/_search?pretty&q=name:test

и получать ожидаемые результаты. .

Я бы хотел, чтобы пользователи моего API могли выполнять произвольные запросы, такие как «name: test», к индексу, чтобы

curl "localhost:8086/myentity/search/querySearch?query=name:test"

возвращал те же результаты, что и раньше. в прямом запросе.

Вот что я пытаюсь, но что бы я ни делал, я получаю 0 результатов:

public List<MyEntity> querySearch(String queryString) {
    QueryParser queryParser = new MultiFieldQueryParser(ALL_FIELDS, new SimpleAnalyzer());
    queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
    org.apache.lucene.search.Query query = queryParser.parse(QueryParser.escape(queryString));

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);

    javax.persistence.Query persistenceQuery = 
            fullTextEntityManager.createFullTextQuery(query, MyEntity.class);

    return persistenceQuery.getResultList();
}

1 Ответ

0 голосов
/ 20 января 2020

Вызывая QueryParser.escape(queryString), вы удаляете значение таких операторов, как :. Поэтому, если пользователь вводит name:test, вы в конечном итоге будете искать документы, содержащие name:test (буквально), вместо того, чтобы искать документы, в поле которых name содержится test.

. все должно работать так, как вы хотите.

Кстати, вы, по сути, используете Lucene для анализа запроса, который затем будет отправлен в Elasticsearch. Более простым решением было бы отправить запрос в Elasticsearch напрямую, особенно если вам не нужно запрещать пользователям доступ к некоторым полям.

public List<Training> querySearch(String queryString) {
    FullTextEntityManager fullTextEm = Search.getFullTextEntityManager(this.entityManager);

    QueryDescriptor query = ElasticsearchQueries.fromQueryString(queryString);

    javax.persistence.Query persistenceQuery = fullTextEm.createFullTextQuery(query, Training.class);

    return persistenceQuery.getResultList();
}

См. https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_queries

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