【问题标题】:Solr Search Failing on Certain CharactersSolr 搜索在某些字符上失败
【发布时间】:2015-09-03 19:20:37
【问题描述】:

我有一个 Solr 集合,它没有返回一些非 ASCII 字符的结果。我们使用的例子是字符串S11. • “≡ «Ñaïvétý» ‘¢¥£’ ¶!#%;即使我在索引字段中有一个对象,搜索整个字符串也不会返回任何结果。但是,搜索该字符串的子字符串会返回匹配项。导致 Solr 不返回匹配项的唯一字符是中间的三个字符:• “≡。该字段被索引为text_en,但我也尝试过edge_ngram(希望有一点Cargo Cult 魔法来解决这个问题)。这三个字符有什么特别之处吗?还是我需要调整 Solr 索引字段的方式?

我们正在通过 django-haystack 进行搜索,但问题也出现在 Solr 管理员中。

以下是两个字段类型定义:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory"        
            generateWordParts="1" generateNumberParts="1" catenateWords="0" 
            catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.EdgeNGramFilterFactory" 
            minGramSize="2" maxGramSize="50" side="front" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" 
            generateWordParts="1" generateNumberParts="1" catenateWords="0" 
            catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    </analyzer>
</fieldType>

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" 
            ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
</fieldType>

【问题讨论】:

  • 你检查过空格是否真的是空格吗?有几个字符看起来像空格,但实际上不是。一个例子是“Non-breaking space”。这些在复制和粘贴时可能会出现乱码。
  • 最后一个问题 :) 如何在您的架构中定义字段类型 text_enedge_ngram?你会分享它们吗?然后我们可以尝试重现该问题。
  • @cheffe - 添加了字段定义。我也想知道空格字符,但据我所知,它们只是普通的空格字符。当我在管理面板中查看查询时,Solr 可以将查询拆分为这些空间上的“单词”,就像其他空间一样。

标签: solr


【解决方案1】:

您是否尝试过使用ASCIIFoldingFilterFactory

转换字母、数字和符号 Unicode 字符 不在前 127 个 ASCII 字符中(“基本拉丁语”Unicode 块)转换成它们的 ASCII 等价物,如果存在的话。

<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false"/>

【讨论】:

    【解决方案2】:

    你能试试这个吗...

    <fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100">
           <analyzer type="index">
             <tokenizer class="solr.KeywordTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="front"/>
                <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50" side="back"/>
           </analyzer>
           <analyzer type="query">
              <tokenizer class="solr.KeywordTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
           </analyzer>
        </fieldType>
    

    【讨论】:

    • 似乎没什么区别。
    • 请看一下分析页面...这是您所期望的吗?
    • 老实说,我不知道自己在看什么。 EdgeNGraFilterFactory 项目似乎正确拆分它并且查询看起来没有损坏。你在看比赛吗?从图片上看不出来。
    • 我在查询中有“• “≡”,它显示在结果中..它在工具中以不同的颜色突出显示。
    • 如果您尝试上面添加的 fieldType...我认为您的问题将得到解决...我添加了分析页面的屏幕截图,其中显示了您所期望的文本匹配.. .
    【解决方案3】:

    我已经尝试了您发布的两种字段类型,并在 Solr 管理页面附带的分析页面上检查了它们。两者似乎都很好 - 看看下面。浅灰色表示已生成匹配项。

    这让我有点困惑。没有获得成功的原因有几个:

    • 您更改了 schema.xml 没有重建索引,这将运行,但不会生成命中
    • 您正在使用 dismax/edismax 查询处理程序,其中 MM 参数定义为不利值。
      • 您可以在 solrconfig.xml 中查找此内容
      • 但这只是默认值,在从您的代码发送请求时,可能会更改该参数。
    • 您在索引期间涉及的三个文件中有有趣的值,即
      • lang/stopwords_en.txt
      • protwords.txt
      • 同义词.txt

    text_en的结果

    edge_ngram 的结果

    【讨论】:

    • 我一直在重建每个更改(至少我希望如此)。我在我们的 conf XML 中没有看到 dismaxedismax 但我将如何检查这是否是问题所在?至于最后一个,即使将同义词和停用词从字段定义中取出似乎也无济于事。
    • 请检查您在 solrconfig.xml 中的&lt;requestHandler ...&gt; 定义您正在使用的处理程序。充其量,将其添加到您的问题中。您可以查看Solr WikiSolr Reference 以了解要查找的内容。
    • 没有 requestHandler 块。
    • 好的,你能分享一下你是如何创建查询/分享查询参数的吗?由于您可能使用默认值,因此您查询的字段可能与您想象的不同。您的架构中的 defaultSerachField 是什么?以防万一。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2020-05-01
    相关资源
    最近更新 更多