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
Lucene 用SOLR搜索短单词_Lucene_Solr - Fatal编程技术网

Lucene 用SOLR搜索短单词

Lucene 用SOLR搜索短单词,lucene,solr,Lucene,Solr,我正在使用SOLR和NGramTokenizerFactory来帮助创建单词子字符串的搜索标记 NGramTokenizer配置的最小字长为3 这意味着我可以搜索例如“unb”,然后匹配单词“难以置信” 然而,我对像“我”和“在”这样的短词有一个问题。SOLR没有为它们编制索引(我怀疑这是因为NGramTokenizer),因此我无法搜索它们 我不想将最小字长减少到1或2,因为这会创建一个巨大的搜索索引。但我希望SOLR包含长度已经低于这个最小值的整个单词 我该怎么做 /Carsten首先,试着

我正在使用SOLR和NGramTokenizerFactory来帮助创建单词子字符串的搜索标记

NGramTokenizer配置的最小字长为3

这意味着我可以搜索例如“unb”,然后匹配单词“难以置信”

然而,我对像“我”和“在”这样的短词有一个问题。SOLR没有为它们编制索引(我怀疑这是因为NGramTokenizer),因此我无法搜索它们

我不想将最小字长减少到1或2,因为这会创建一个巨大的搜索索引。但我希望SOLR包含长度已经低于这个最小值的整个单词

我该怎么做


/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"/>