作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了我的分析仪如下
@AnalyzerDefs({
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
//@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class, params = {
@Parameter(name = "minGramSize", value = "3"),
@Parameter(name = "maxGramSize", value = "255") }) }),
//-----------------------------------------------------------------------
@AnalyzerDef(name = "ngram_query",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
//@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
})
})
@Analyzer(definition = "ngram")
public class EPCAsset extends Asset {
@Field
private String obturatorMaterial;
}
"234"
" 23"
" 234"
"cq "
"cq 2"
"cq 23"
"cq 234"
"icq"
"icq "
"icq 2"
"icq 23"
"icq 234"
"q 2"
"q 23"
"q 234"
FullTextEntityManager fullTextEntityManager = Search
.getFullTextEntityManager(entityManager);
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(entityClass).get();
Query query = qb.phrase().onField("obturatorMaterial").sentence("icqabc").createQuery();
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query,
entityClass);
fullTextQuery.getResultList()
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(entityClass).overridesForField("obturatorMaterial","ngram_query").get();
org.hibernate.search.exception.SearchException: HSEARCH000353: Unknown analyzer: 'ngram_query'. Make sure you defined this analyzer.
最佳答案
首先,您应该仔细检查一个ngram过滤器确实是您想要的。我之所以这样说是因为ngram分析器通常同时用于索引和查询,因此它提供了模糊匹配。这就是这个分析仪的重点。
用户键入cq 2
时,您真的需要匹配吗?是否有意义?在实现自动完成功能时,人们通常更喜欢仅匹配包含以用户输入开头的单词的文档,因此i
将匹配,ic
和icq
也将匹配,但cq 2
不匹配。如果这正是您想要的,则应查看“edge_ngram”过滤器。它倾向于提高匹配的相关性,并且不需要太多的磁盘空间。
现在,即使使用“edge_ngram”过滤器,您也需要在查询时禁用ngram。在Hibernate Search中,这是通过“覆盖”分析器来完成的。
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(EPCAsset.class)
.overridesForField( "obturatorMaterial", "ngram_query" )
.get();
关于elasticsearch - 使用nGram进行休眠搜索|如何指示nGram在搜索期间不赚钱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56072611/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
我是一名优秀的程序员,十分优秀!