Hibernate搜索 - 通配符和空间

问题描述 投票:0回答:1

我正在使用多个单词/字段的Hibernate搜索,它按预期工作,直到我启用通配符。这是我的实体分析器:

@AnalyzerDef(name = "autocompleteAnalyzer",
        tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
        filters = {
                // remove accents
                @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
                // lower case
                @TokenFilterDef(factory = LowerCaseFilterFactory.class),
                // Start with same root
                @TokenFilterDef(
                        factory = SnowballPorterFilterFactory.class,
                        params = { @Parameter(name = "language", value = "English") })
        })

这是我的疑问:

    if(criteria.length() > 0) {
        fullTextQuery = queryBuilder
                .keyword()
                // .wildcard() => not in use 
                .onFields("firstName", "lastName", "extraName", "biography")
                .matching(criteria)
                .createQuery();

场景01 如果我搜索“约翰史密斯”之类的东西,我会得到以下问题:

+((firstName:john firstName:smith) 
(lastName:john lastName:smith) 
(extraName:john extraName:smith) 
(biography:john biography:smith))

找到任何名叫约翰或史密斯的人。

场景02如果我搜索“John *”,因为我想找到名字以John(Johnny,Johson)开头的任何人,我需要启用以下通配符:

fullTextQuery = queryBuilder
   .keyword()
   .wildcard()

当我通过返回以下查询键入“John *”时,哪个有效:

+(firstName:john* lastName:john* extraName:john* biography:john*)

但是当我输入类似“John * Smith”的内容时它不再起作用,因为它没有分割单词,我相信这是由于Wildcard选项:

+(firstName:john* smith lastName:john* smith extraName:john* smith biography:john* smith)
java hibernate hibernate-search
1个回答
1
投票

关键字查询将始终匹配包含任何提供的关键字的文档。通配符查询不应用分析。所以你的情况也不合适。

使用simpleQueryString查询,并强制默认运算符为“and”:

        fullTextQuery = queryBuilder
                .simpleQueryString()
                .onFields("firstName", "lastName", "extraName", "biography")
                .withAndAsDefaultOperator()
                .matching(criteria)
                .createQuery();

文档:https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_simple_query_string_queries

© www.soinside.com 2019 - 2024. All rights reserved.