gpt4 book ai didi

elasticsearch - 使用nGram进行休眠搜索|如何指示nGram在搜索期间不赚钱

转载 作者:行者123 更新时间:2023-12-03 01:30:50 25 4
gpt4 key购买 nike

我定义了我的分析仪如下

@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;

}

它可以在索引时间内完美地制作n克项的 vector 。但这也会在搜索期间产生n-gram搜索查询。

我想要的是一种搜索查询使用n-gram索引进行搜索而又不将搜索词分解为g的方法。

注意:我必须在这里使用n-gram,因为要求是在文本中的任何位置进行搜索。开始或中间。所以我无法选择edge-n-gram。

例:
输入要作为索引的数据 ICQ 234

然后在索引时间内其项 vector 为

    "234"
" 23"
" 234"
"cq "
"cq 2"
"cq 23"
"cq 234"
"icq"
"icq "
"icq 2"
"icq 23"
"icq 234"
"q 2"
"q 23"
"q 234"


现在,当我搜索 icq 时,它可以完美运行。但它也适用于 icqabc 。在搜索期间,它会进行n克的搜索查询。因此,有一种方法可以在搜索期间不破坏搜索词,而是使用n-gram索引进行搜索。

这是我的搜索查询大厦
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()

我正在使用 flex 搜索作为Hibernate搜索的后端。

编辑:
我还根据@yrodiere的答案应用了查询时间分析器,但它给了我错误。
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.



编辑

按照此链接 overriderForField when using elasticsearch backed hibernate search

现在,我可以定义一个查询时间2nd分析器,它解决了这个问题。

最佳答案

首先,您应该仔细检查一个ngram过滤器确实是您想要的。我之所以这样说是因为ngram分析器通常同时用于索引和查询,因此它提供了模糊匹配。这就是这个分析仪的重点。

用户键入cq 2时,您真的需要匹配吗?是否有意义?在实现自动完成功能时,人们通常更喜欢仅匹配包含以用户输入开头的单词的文档,因此i将匹配,icicq也将匹配,但cq 2不匹配。如果这正是您想要的,则应查看“edge_ngram”过滤器。它倾向于提高匹配的相关性,并且不需要太多的磁盘空间。

现在,即使使用“edge_ngram”过滤器,您也需要在查询时禁用ngram。在Hibernate Search中,这是通过“覆盖”分析器来完成的。

  • 首先,定义第二个分析器,该分析器与在索引编制过程中使用的分析器相同,但没有“ngram”或​​“edge_ngram”过滤器。将其命名为“ngram_query”。
  • 然后,使用它来创建查询构建器:
    QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(EPCAsset.class)
    .overridesForField( "obturatorMaterial", "ngram_query" )
    .get();
  • 使用查询生成器照常创建查询。

  • 请注意,如果您依靠Hibernate Search将索引架构和分析器推送到Elasticsearch,则必须使用hack才能推送仅查询分析器:默认情况下,只有在索引期间实际使用的分析器才被推送。推。参见 https://discourse.hibernate.org/t/cannot-find-the-overridden-analyzer-when-using-overridesforfield/1043/4

    关于elasticsearch - 使用nGram进行休眠搜索|如何指示nGram在搜索期间不赚钱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56072611/

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