【问题标题】:How to use analyzer in Hibernate Search?如何在 Hibernate Search 中使用分析器?
【发布时间】:2014-08-13 15:48:36
【问题描述】:

当我将 Infinispan 与 Hibernate 一起使用时,我需要使用 Analyzer 来查找包含关键字的结果。

但是当我搜索关键字SNO_NO_D6-11100 时,查询如下:

QueryBuilder queryBuilder = CSECore.searchManager
                  .buildQueryBuilderForClass(Hierarchy.class).get();
Query query = queryBuilder
        .keyword().onField("path").matching("SNO_NO_D6-11100").createQuery();

它将SNO_NO_D6-11100 分隔为SNO_NO_D611100,然后分别找到它们并将2 个结果合并在一起。会有一些结果不正确。

如果我忽略分析器,它只会找到同样不正确的完全匹配。有没有Analyzer可以忽略“-”的解决方案??

【问题讨论】:

  • 澄清一下,您正在寻找在path 字段中包含术语SNO_NO_D6-11100 的结果?
  • 是的,我需要 Analyzer 来执行此操作。

标签: hibernate lucene hibernate-search infinispan


【解决方案1】:

尝试使用短语查询(请参阅第 5.1.2.4 节 in the hibernate query dsl):

Query query = queryBuilder.phrase().onField("path").sentence("SNO_NO_D6-11100").createQuery();

这两个词仍然是分开的,但由于它是一个短语查询,它会搜索两个连续出现的独立词。所以它无法区分“SNO_NO_D6-11100”和“SNO_NO_D6 11100”,但我猜这可能是可以接受的。

【讨论】:

  • 感谢您的回复,这确实很有帮助。但我只是想知道是否有办法像我写自己的Custom Bridge 一样写我的Analyzer
  • 您可以通过几种不同的方式将分析仪设置为您喜欢的任何内容,请参阅:section 1.6: Analyzer
【解决方案2】:

使用 Hibernate 5.10.3,我们可以在搜索时覆盖分析器:

FullTextEntityManager fte = Search.getFullTextEntityManager(em);
QueryBuilder qb = fte.getSearchFactory().buildQueryBuilder().forEntity(Article.class)
                .overridesForField("path", "keywordanalyzer")
                .get();

其中ngram_search 是一个自定义分析器,定义如下:

@AnalyzerDef(name = "keywordanalyzer",
        tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class))

请注意,KeywordTokenizerFactory 不会拆分输入,它基本上将整个输入作为单个令牌发出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多