QueryDSL и Hibernate-поиск с помощью анализаторов Lucene

Я настроил Hibernate-Search для использования моего пользовательского анализатора при индексировании моих сущностей. Однако, когда я пытаюсь выполнить поиск с помощью интеграции QueryDSL Hibernate-Search, он не находит объекты, но если я использую прямой поиск в спящем режиме, он что-то находит.

@AnalyzerDef(name = "customanalyzer",
    tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
    filters = {
            @TokenFilterDef(factory = LowerCaseFilterFactory.class),
            @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
                    @Parameter(name = "language", value = "English")
            })
    })
@Analyzer(definition = "customanalyzer")
public abstract class Post extends BaseEntity {}

Я проиндексировал объект с заголовком «Быстрая коричневая лиса перепрыгнула через ленивую собаку».

Эти работы…

List articlePosts = fullTextEntityManager.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2
List articlePosts = fullTextSession.createFullTextQuery(queryBuilder.keyword().onFields("title").matching("jumped").createQuery(), ArticlePost.class).getResultList(); // list of 2

Это не…

SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jumped")).list() // empty list

Но поиск того, как это, вероятно, хранится в Lucene (вероятный результат SnowballPorter), тогда он работает ...

SearchQuery<ArticlePost> query = new SearchQuery<ArticlePost>(this.entityManagerFactory.createEntityManager().unwrap(HibernateEntityManager.class).getSession(), post);
List articlePosts = query.where(post.title.contains("jump")).list() // list of 2

Таким образом, кажется, что при использовании QueryDSL анализатор не запускается до того, как он выполнит запрос. Может ли кто-нибудь подтвердить, что это проблема, и есть ли способ, чтобы они автоматически запускались до того, как QueryDSL выполнит запрос?


person redZebra2012    schedule 23.10.2012    source источник
comment
Вы пробовали прямой полнотекстовый запрос также через сеанс или только через EntityManager?   -  person Timo Westkämper    schedule 24.10.2012
comment
У меня не было, но я просто протестировал и добавил результаты в свой пример. С помощью Session или EntityManager я по-прежнему получаю правильные результаты с помощью встроенного Hibernate-Search. Я расширил свой пример, чтобы показать, использую ли я QueryDSL, я могу заставить его работать, если буду искать, как он, вероятно, хранится в Lucene после применения анализаторов.   -  person redZebra2012    schedule 25.10.2012
comment
Хорошо, я думаю, что понял это, или, по крайней мере, способ получить запросы, которые я ищу. Похоже, вы работаете на Mysema, поэтому я проверю это перед тем, как ответить на свой вопрос. Запросы, созданные с помощью QueryDSL для Hibernate-Search, похоже, создаются с явным равенством при передаче в Hibernate-Search. Однако модуль QueryDSL Hibernate-Search также предоставляет новый предикат LuceneUtils.fuzzyLike (propertyPath, value), который дает мне результаты, которые я ищу. Я подозреваю, что мне нужно использовать это вместо object.propertyPath.like (value) при запросе Lucene.   -  person redZebra2012    schedule 25.10.2012
comment
Может быть, нечеткий запрос можно использовать внутри для stringPath.matches (что-то)?   -  person Timo Westkämper    schedule 29.10.2012


Ответы (1)


Что касается вашего вопроса, анализатор применяется по умолчанию при использовании DSL запроса. В большинстве случаев имеет смысл использовать один и тот же анализатор для индексации и поиска. По этой причине анализатор применяется по умолчанию, если не используется ignoreAnalyzer.

Я не могу вам сказать, почему ваш второй пример не работает. SearchQuery не является частью Hibernate Search или ORM API. Это должен быть внутренний класс вашего приложения. Что происходит в этом классе? Какой тип запроса он использует?

person Hardy    schedule 24.10.2012
comment
Вопросы, похоже, касаются структуры Querydsl, а не Query DSL для поиска Hibernate. Фреймворк Querydsl обеспечивает поддержку Hibernate Search, и SearchQuery является его частью. - person Timo Westkämper; 25.10.2012
comment
Да я вижу. Тем не менее, нужно понимать, что происходит под капотом. Также во втором примере, похоже, чего-то не хватает. Где актуальные критерии поиска? - person Hardy; 25.10.2012
comment
Спасибо за ответ, Харди. Тимо прав в том, что я говорю о запросе Hibernate-Search с использованием QueryDSL, а не собственного Hibernate-Search. Когда я использую собственный Hibernate-Search, он работает нормально. - person redZebra2012; 25.10.2012