如何在Solr中进行部分开始匹配?
我试图在一个大的姓氏列表中搜索部分开始匹配项。所以Wein应该找到Weinberg,Weinkamm等等 我可以通过创建一个特殊字段并添加如何在Solr中进行部分开始匹配?,solr,Solr,我试图在一个大的姓氏列表中搜索部分开始匹配项。所以Wein应该找到Weinberg,Weinkamm等等 我可以通过创建一个特殊字段并添加 在schema.xml中创建其类型规范。当我仅将上面的行添加到索引分析器中,并将其留空供查询分析器使用时,我就可以通过搜索特殊的_字段:Wein进行搜索,并获得预期的结果 现在我看到solr还有一个*-语法。EdgeNGramFilterFactory和*-语法之间有什么联系 我做的事情是正确的还是有更好、更有规律的方法 谢谢 我不推荐Wein*查询。这在
在schema.xml中创建其类型规范。当我仅将上面的行添加到索引分析器中,并将其留空供查询分析器使用时,我就可以通过搜索特殊的_字段:Wein进行搜索,并获得预期的结果
现在我看到solr还有一个*-语法。EdgeNGramFilterFactory和*-语法之间有什么联系
我做的事情是正确的还是有更好、更有规律的方法
谢谢 我不推荐Wein*查询。这在内部实现为PrefixQuery,它重写原始查询以包含前缀等于“Wein”的所有术语。根据索引的大小(我指的是有多少个术语),此查询重写可能是一个瓶颈
在索引时使用Edgengram过滤器是一种更好的方法。此解决方案将使用更多空间,但查询的处理速度将快得多 注意:我在Lucene论坛上也问了这个问题,我得到了一个很好的答案:
或者只需进行简单的通配符匹配:
name:Pe*
谢谢我不期望有太多的查询词,所以我使用了通配符语法,并且对它非常满意。我指的是索引词的数量,而不是查询词。Solr/Lucene对所有索引词进行线性搜索,以选择具有相同前缀的词子集。选择子集后,查询将展开以包括这些术语。因此,瓶颈是线性搜索。那么,我仍然推荐EdgeNGramFilter,除非你说你的索引中有几个术语。我理解。一旦我们达到性能极限,我可能会在这方面做同样的改变。谢谢