gpt4 book ai didi

java - Hibernate 搜索前缀

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:28 25 4
gpt4 key购买 nike

现在,我已经成功配置了一个基本的 Hibernate 搜索索引,以便能够在我的 JPA 实体的各个字段上搜索完整的单词:

@Entity
@Indexed
class Talk {
@Field String title
@Field String summary
}

我的查询看起来像这样:

List<Talk> search(String text) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager)
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Talk).get()
Query query = queryBuilder
.keyword()
.onFields("title", "summary")
.matching(text)
.createQuery()
FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(query, Talk)
return jpaQuery.getResultList()
}

现在我想微调这个设置,这样当我搜索“test”时,它仍然会找到标题或摘要包含“test”的演讲,即使它是另一个词的前缀。因此,标题为“单元测试”或摘要包含“睾丸”的演讲仍应出现在搜索结果中,而不仅仅是标题或摘要包含“测试”作为完整词的演讲。

我已尝试查看文档,但我无法确定是否应该更改实体的索引方式,或者它是否与查询有关。请注意,我想执行如下操作,但很难在多个字段上进行搜索:

 Query query = queryBuilder
.keyword().wildcard()
.onField("title")
.matching(text + "*")
.createQuery()

编辑:根据 Hardy 的回答,我像这样配置了我的实体:

@Indexed
@Entity
@AnalyzerDefs([
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = [
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = [
@Parameter(name = "minGramSize",value = "3"),
@Parameter(name = "maxGramSize",value = "3")
])
])
])
class Talk {
@Field(analyzer=@Analyzer(definition="ngram")) String title
@Field(analyzer=@Analyzer(definition="ngram")) String summary
}

多亏了这个配置,当我搜索“arti”时,我得到了标题或摘要中包含“arti”是(艺术家、手工等)的子词的演讲。不幸的是,在这些之后,我还得到了标题或摘要包含包含我的搜索词的子词(艺术、放屁等)的词的演讲。可能需要进行一些微调来消除这些问题,但至少我现在可以更快地得到结果,并且它们的顺序合理。

最佳答案

您可以在这里做很多事情。通过在索引时间内进行适当的分析,可以做很多事情。

例如,您想要应用适合您的语言的词干分析器。对于英语,这通常是 Snowball 词干提取器。其想法是在索引期间将所有单词缩减为其词干,例如 testingtested 到 _test。这会让您有所了解。

您可以研究的另一件事是 ngramm 索引。根据您的描述,您还想在不相关的词中找到匹配项。这里的想法是索引每个单词的“子词”,以便以后可以找到它们。

关于您要查看的分析器 named analyzers Hibernate Search 文档的一部分。这里的关键是 @AnalyzerDef 注释。

在查询方面,您还可以应用一些“技巧”。事实上,您可以使用通配符查询,但是,如果您使用的是 Hibernate Search 查询 DSL,则不能使用 keyword 查询,但您需要使用 wildcard 查询。再次检查 Hibernate Search 文档。

关于java - Hibernate 搜索前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com