Lucene 用SOLR搜索短单词
我正在使用SOLR和NGramTokenizerFactory来帮助创建单词子字符串的搜索标记 NGramTokenizer配置的最小字长为3 这意味着我可以搜索例如“unb”,然后匹配单词“难以置信” 然而,我对像“我”和“在”这样的短词有一个问题。SOLR没有为它们编制索引(我怀疑这是因为NGramTokenizer),因此我无法搜索它们 我不想将最小字长减少到1或2,因为这会创建一个巨大的搜索索引。但我希望SOLR包含长度已经低于这个最小值的整个单词 我该怎么做Lucene 用SOLR搜索短单词,lucene,solr,Lucene,Solr,我正在使用SOLR和NGramTokenizerFactory来帮助创建单词子字符串的搜索标记 NGramTokenizer配置的最小字长为3 这意味着我可以搜索例如“unb”,然后匹配单词“难以置信” 然而,我对像“我”和“在”这样的短词有一个问题。SOLR没有为它们编制索引(我怀疑这是因为NGramTokenizer),因此我无法搜索它们 我不想将最小字长减少到1或2,因为这会创建一个巨大的搜索索引。但我希望SOLR包含长度已经低于这个最小值的整个单词 我该怎么做 /Carsten首先,试着
/Carsten首先,试着理解为什么solr不会使用“分析工具”为你的单词编制索引 只需输入你正在搜索的字段和文本,看看哪个分析器正在过滤你的短期数据。我建议你这样做,因为你说你只有一个“嫌疑犯”,你必须确定哪个分析仪过滤你的数据 那你为什么不直接把这个术语复制到另一个领域,而不用分析仪呢 通过这种方式,您的术语将被索引两次,并将显示为精确单词和n-gram。 然后你必须处理两个不同领域的分数 我希望这对你有所帮助 聚合和copyfield属性的某些链接:
我遇到了一个类似的问题,我试图保留简短的单词而不创建一个庞大的solr索引 因此,我提出了一个更简单的解决方案,不需要任何新字段或复制值:
<!-- Keep small words safe from the n-gram filter -->
<filter class="solr.PatternReplaceFilterFactory" pattern="^(.{2})$" replacement=" $1"/>
<!-- Do the n-gramming -->
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
<filter class="solr.ReverseStringFilterFactory"/>
<!-- Remove the padding spaces -->
<filter class="solr.TrimFilterFactory"/>
谢谢你的建议。我对两个词进行了分析:一个正常的案例——“jeudan”和一个字母的词“j”。这里是您可以看到的结果,实际上是NGramTokenizer过滤掉了1个字母的单词,或者在这里是EdgeNGramTokenizer,但我已经用这两个词进行了测试。我可以试试你的建议,但我更愿意让Solr做所有的文字咀嚼。我做了很多特定于字段的搜索,因此您的建议将导致需要重写这些查询,以便在两个文本字段而不是一个文本字段中查找。考虑到在SOLR中有一个典型的聚合字段,在那里你可以进行查询,然后是一系列不同类型和分析器的字段。只需使用copyfield标记将所有源字段复制到目标。你不必改变你的疑问。你的回答实际上解决了我面临的这个问题和其他问题。我不知道这个分析工具。最后,我通过Analyzer尝试了其他一些过滤器和标记器,并在索引和查询部分使用了语音过滤器。非常整洁-非常感谢!哇!9年后。我猜这样的问题永远不会过时。:-)
<!-- Keep small words safe from the n-gram filter -->
<filter class="solr.PatternReplaceFilterFactory" pattern="^(.{2})$" replacement=" $1"/>
<!-- Do the n-gramming -->
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
<filter class="solr.ReverseStringFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
<filter class="solr.ReverseStringFilterFactory"/>
<!-- Remove the padding spaces -->
<filter class="solr.TrimFilterFactory"/>
<!-- Protect single characters! (Two spaces) -->
<filter class="solr.PatternReplaceFilterFactory" pattern="^(.{1})$" replacement=" $1"/>