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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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(查询分析器)中标记NGramFilterFactory的结果_Filter_Solr_Full Text Search_Tokenize - Fatal编程技术网

在Solr(查询分析器)中标记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" 但是

我正在使用NGramFilterFactory进行索引和查询

因此,如果我搜索“溢出”,它会创建如下查询:

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将创建以下标记(匹配的标记为粗体):

ssusurSURRISURRI,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,我会看看它的!