当搜索词包含定界符时,通常首选的搜索结果排名方式是什么

What is the generally preferred way to rank search results when search term includes delimiter

我有两个文档 4349P 43

P 43 return 的搜索字符串都按顺序

我的索引定义如下

@AnalyzerDefs({
    @AnalyzerDef(
        name = "ngram",
        charFilters = {
            @CharFilterDef(factory = HTMLStripCharFilterFactory.class)
        },
        tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
        filters = {
            @TokenFilterDef(factory = StandardFilterFactory.class),
            @TokenFilterDef(factory = LowerCaseFilterFactory.class),
            @TokenFilterDef(factory = StopFilterFactory.class, params = {
                @Parameter(name = "words", value = "/org/apache/lucene/analysis/snowball/english_stop.txt")}),
            @TokenFilterDef(factory = EdgeNGramFilterFactory.class, params = {
                @Parameter(name = "maxGramSize", value = "1"),
                @Parameter(name = "maxGramSize", value = "15")
            })
        }
    ),

我的搜索定义在没有 ngramfilter 的情况下是相同的,我已经关闭了 lengthnorm。

问:如何将第2return作为更高匹配或者returned列表排名好?

问:另一种表达方式是如何考虑输入查询中的令牌顺序或已经考虑?

我可以使用 querybuilder.phrase().withSlop(10)...sentence('P 43') 但现在它不再是 return 第一个结果,只有第二个

您需要了解您的分析器定义将如何分解您的术语。

使用这样的 EdgeNGramFilterFactory 你的 4349 将被转换成这样的标记序列:

  • 4349 -> [4, 43, 434, 4349]

虽然 "P 43" 将被类似地拆分,但只有在将 "P" 与“43”分开之后,因为您还有一个 StandardTokenizerFactory:

  • P 43 -> [p, 4, 43]

所以这些标记被插入到你的倒排索引中。

在查询时,句子"P 43"将使用相同的方法拆分:

  • P 43 -> [p, 4, 43]

您的两个文档都将包含所有 443,就像您的查询所要求的那样。所以两个文件都匹配。

现在,如果您重复测试但禁用基于 N-Gram 的过滤器,我们将有一个不同的索引:

  • 4349 -> [4349]
  • P 43 -> [p, 43]

您的查询将是:

  • P 43 -> [p, 43]

只有第二个文档匹配 p43 两个词中的任何一个,因此只有第二个文档会被视为匹配项。

我建议使用助手 class org.hibernate.search.util.AnalyzerUtils,这是我自己用来确认将要为每个生成哪些令牌输入/分析仪配置。

Analyzer analyzer = searchFactory.getAnalyzer( "ngram" );
System.out.println( AnalyzerUtils.tokenizedTermValues( analyzer, "description", "4349" ) );
System.out.println( AnalyzerUtils.tokenizedTermValues( analyzer, "description", "P 43" ) );