【问题标题】:Hibernate Search - Wildcard and spaceHibernate Search - 通配符和空格
【发布时间】:2019-04-25 09:16:21
【问题描述】:

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

@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
如果我搜索“John Smith”之类的内容,我会得到以下查询:

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

找到任何名叫 John 或 Smith 的人。

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

fullTextQuery = queryBuilder
   .keyword()
   .wildcard()

当我通过返回以下查询键入“John*”时,这会起作用:

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

但是当我输入“John* Smith”之类的内容时它不再起作用,因为它不会拆分单词,我认为这是由于通配符选项:

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

【问题讨论】:

    标签: java hibernate hibernate-search


    【解决方案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

    【讨论】:

    • 字段之间不是和“and”,是关键字之间的and。请试试看?
    • 道歉,实际上我错过了 *.它按预期工作。
    猜你喜欢
    • 2013-02-23
    • 2015-07-18
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多