Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Solr中进行部分开始匹配?_Solr - Fatal编程技术网

如何在Solr中进行部分开始匹配?

如何在Solr中进行部分开始匹配?,solr,Solr,我试图在一个大的姓氏列表中搜索部分开始匹配项。所以Wein应该找到Weinberg,Weinkamm等等 我可以通过创建一个特殊字段并添加 在schema.xml中创建其类型规范。当我仅将上面的行添加到索引分析器中,并将其留空供查询分析器使用时,我就可以通过搜索特殊的_字段:Wein进行搜索,并获得预期的结果 现在我看到solr还有一个*-语法。EdgeNGramFilterFactory和*-语法之间有什么联系 我做的事情是正确的还是有更好、更有规律的方法 谢谢 我不推荐Wein*查询。这在

我试图在一个大的姓氏列表中搜索部分开始匹配项。所以Wein应该找到Weinberg,Weinkamm等等

我可以通过创建一个特殊字段并添加

在schema.xml中创建其类型规范。当我仅将上面的行添加到索引分析器中,并将其留空供查询分析器使用时,我就可以通过搜索特殊的_字段:Wein进行搜索,并获得预期的结果

现在我看到solr还有一个*-语法。EdgeNGramFilterFactory和*-语法之间有什么联系

我做的事情是正确的还是有更好、更有规律的方法


谢谢

我不推荐Wein*查询。这在内部实现为PrefixQuery,它重写原始查询以包含前缀等于“Wein”的所有术语。根据索引的大小(我指的是有多少个术语),此查询重写可能是一个瓶颈


在索引时使用Edgengram过滤器是一种更好的方法。此解决方案将使用更多空间,但查询的处理速度将快得多

注意:我在Lucene论坛上也问了这个问题,我得到了一个很好的答案:

或者只需进行简单的通配符匹配:

name:Pe*

谢谢我不期望有太多的查询词,所以我使用了通配符语法,并且对它非常满意。我指的是索引词的数量,而不是查询词。Solr/Lucene对所有索引词进行线性搜索,以选择具有相同前缀的词子集。选择子集后,查询将展开以包括这些术语。因此,瓶颈是线性搜索。那么,我仍然推荐EdgeNGramFilter,除非你说你的索引中有几个术语。我理解。一旦我们达到性能极限,我可能会在这方面做同样的改变。谢谢