当搜索词包含定界符时,通常首选的搜索结果排名方式是什么
What is the generally preferred way to rank search results when search term includes delimiter
我有两个文档 4349
和 P 43
。
P 43
return 的搜索字符串都按顺序
4349
P 43
我的索引定义如下
@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
]
您的两个文档都将包含所有 4
和 43
,就像您的查询所要求的那样。所以两个文件都匹配。
现在,如果您重复测试但禁用基于 N-Gram 的过滤器,我们将有一个不同的索引:
4349
-> [4349
]
P 43
-> [p
, 43
]
您的查询将是:
P 43
-> [p
, 43
]
只有第二个文档匹配 p
或 43
两个词中的任何一个,因此只有第二个文档会被视为匹配项。
我建议使用助手 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" ) );
我有两个文档 4349
和 P 43
。
P 43
return 的搜索字符串都按顺序
4349
P 43
我的索引定义如下
@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
]
您的两个文档都将包含所有 4
和 43
,就像您的查询所要求的那样。所以两个文件都匹配。
现在,如果您重复测试但禁用基于 N-Gram 的过滤器,我们将有一个不同的索引:
4349
-> [4349
]P 43
-> [p
,43
]
您的查询将是:
P 43
-> [p
,43
]
只有第二个文档匹配 p
或 43
两个词中的任何一个,因此只有第二个文档会被视为匹配项。
我建议使用助手 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" ) );