在Solr(查询分析器)中标记NGramFilterFactory的结果
我正在使用NGramFilterFactory进行索引和查询 因此,如果我搜索“溢出”,它会创建如下查询:在Solr(查询分析器)中标记NGramFilterFactory的结果,filter,solr,full-text-search,tokenize,Filter,Solr,Full Text Search,Tokenize,我正在使用NGramFilterFactory进行索引和查询 因此,如果我搜索“溢出”,它会创建如下查询: mySearchField:"ov ve ... erflow overflo verflow overflow" mySearchField:"ow" mySearchField:"we" mySearchField:"erflow" mySearchField:"owerflo" mySearchField:"werflow" mySearchField:"owerflow" 但是
mySearchField:"ov ve ... erflow overflo verflow overflow"
mySearchField:"ow"
mySearchField:"we"
mySearchField:"erflow"
mySearchField:"owerflo"
mySearchField:"werflow"
mySearchField:"owerflow"
但是如果我拼错了“overflow”,即“owerflow”,则没有匹配项,因为查询周围的引号:
mySearchField:"ow we ... erflow owerflo werflow owerflow"
是否可以标记NGramFilteFactory的结果,它将创建如下查询:
mySearchField:"ov ve ... erflow overflo verflow overflow"
mySearchField:"ow"
mySearchField:"we"
mySearchField:"erflow"
mySearchField:"owerflo"
mySearchField:"werflow"
mySearchField:"owerflow"
在本例中,solr还将查找结果,因为标记“erflow”存在。您不需要像编写的那样标记查询。检查在
schema.xml
中是否在索引时间和查询时间应用了NGramFilterFactory
。
然后,您正在使用的查询解析器会产生不同。使用LuceneQParser
可以得到您想要的结果,但使用demax
和eDisMax
则不行
我用eDisMax
和debugQuery=on
检查了查询mySearchField:owerflow
:
<str name="querystring">text:owerflow</str>
<str name="parsedquery">
+((text:o text:w text:e text:r text:f text:l text:o text:w text:ow text:we text:er text:rf text:fl text:lo text:ow text:owe text:wer text:erf text:rfl text:flo text:low text:ower text:werf text:erfl text:rflo text:flow text:owerf text:werfl text:erflo text:rflow text:owerfl text:werflo text:erflow text:owerflo text:werflow text:owerflow)~36)
</str>
text:owerflow
+((文本:o文本:w文本:e文本:r文本:f文本:l文本:o文本:w文本:ow文本:we文本:er文本:rf文本:fl文本:lo文本:ow文本:wer文本:erf文本:rfl文本:flo文本:low文本:werf文本:rflo文本:werfl文本:erflo文本:rflo文本:rflo文本:rflo文本:erflo文本:erflo文本:erflow文本:ow文本:OWRFLOW文本:OWRFLOW文本:OWRFLOW文本)~36)
如果查看生成的查询的结尾,您将看到~36
,其中36是从查询生成的n克数。由于该~36
,您不会得到任何结果,但您可以通过参数更改它,该参数是应匹配的最小值
如果将查询更改为mySearchField:owerflow&mm=1
或小于25的值,则将得到您要查找的结果
此答案与您的答案之间的区别在于,使用EdgeNGramFilterFactory
中缀查询,如mySearchField:werflow
不会返回任何结果,而使用NGramFilterFactory
则会返回任何结果
无论如何,如果您正在使用
NGramFilterFactory
进行拼写更正,我强烈建议您也来看看,它正是为了这个目的而制作的。好的,我找到了一种快速简便的方法来解决这个问题
fieldType有一个可选属性autoGeneratePhraseQueries(默认值=true)。如果我将AutoGenerateFlaseQueries设置为false,则一切正常
说明:
schema.xml中使用的字段类型:
<fieldType name="edgytext" class="solr.TextField" autoGeneratePhraseQueries="false">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhiteSpaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
</fieldType>
如果要为“惊喜”一词编制索引,则索引中包含以下标记:
s、 苏,苏尔,苏尔,苏尔,苏尔,苏尔,苏尔,苏尔,苏尔
如果您正在搜索“surpriese”(拼写错误),solr将创建以下标记(匹配的标记为粗体):
s,su,sur,SURRI,SURRI,SURRIE,SURRIES,SURRIES
将创建的实际查询如下所示:
我的搜索区:s,我的搜索区:su,我的搜索区:sup。。等等
但如果将autogenerateFlaseQueries设置为true,则将创建以下查询:
我的搜索领域:“s su SUP supr supr supr SUPRIE SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES SUPRIES su
这是一个短语查询,与索引术语不匹配。谢谢您的回答。SpellCheckComponent是我不适合的特殊情况,因为我需要拼写错误的单词的搜索结果,而不是正确拼写的建议。但是我找到了另一个解决方案(见我的答案)。@MaxSchmidt我有机会更深入地研究了你的问题,并使用
NGramFilterFactory
找到了一个解决方案,看看我更新的答案。无论如何,你当然可以使用拼写检查组件
对拼写错误的单词进行拼写更正。这很奇怪。使用eDisMax和debugQuery=on且不使用AutogenerateFlaseQueries=“false”时,我得到:text:overflow+DisjunctionMaxQuery((text:o v e r f l o w v v v e r f l o w v e r f f f r f f f f l low))()奇怪!哪个solr版本?你确定eDisMax
不是DisMax
?确切的查询字符串:我使用的是solr/lucene 3.5实际上我不理解这个解决方案,但我很好奇,我不知道这个参数;)你能从你的schema.xml
中发布你的mySearchField
字段定义吗?@javanna我在回答中添加了一个解释。请注意,我终于使用了EdgeNGramFilterThanks,我会看看它的!