【问题标题】:Solr : Search with special character with Phrase searchSolr:使用短语搜索使用特殊字符进行搜索
【发布时间】:2013-04-02 03:21:41
【问题描述】:

我们需要让 Solr Search 像

"Success & Failure"
"Working 50%"

但是 Solr 查询解析器会从搜索中消除所有特殊字符,尽管如果我向它添加转义序列。

我的搜索查询如下所述

http://localhost:8080/solr/core0/select?q=%22Success%20\%26%20Failure%22&debugQuery=on

下面是它的调试查询。

<lst name="debug">
   <str name="rawquerystring">"Success & Failure"</str>
   <str name="querystring">Success & Failure"</str>
   <str name="parsedquery">PhraseQuery(text:"success failure")</str>
   <str name="parsedquery_toString">text:"success failure"</str>
   <lst name="explain"/>
    <str name="QParser">LuceneQParser</str>
    <lst name="timing"></lst>
 </lst>

我已经在网上搜索过这个,我得到的结果说应该索引特殊字符以使其工作,因为默认情况下 solr 不索引任何特殊字符。

为此,我已将solr.WordDelimiterFilterFactory 添加到我的TextField 定义中

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
     <!--   <charFilter class="solr.MappingCharFilterFactory" mapping="char-mapping.txt"/>-->
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnCaseChange="0"
                splitOnNumerics="0"
                stemEnglishPossessive="0"
                generateWordParts="0"
                generateNumberParts="0"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                preserveOriginal="1"
                types="wdfftypes.txt"
                />
       <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnCaseChange="0"
                splitOnNumerics="0"
                stemEnglishPossessive="0"
                generateWordParts="0"
                generateNumberParts="0"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                preserveOriginal="1"
                types="wdfftypes.txt"
                />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

虽然这样做,但它不会在搜索词中解析 &amp;

我们要make,solr应该用“success & failure”搜索,不应该去掉特殊字符。

有人知道怎么做吗?

【问题讨论】:

    标签: solr query-parser


    【解决方案1】:

    您应该考虑使用 solr.WhitespaceTokenizerFactory 而不是 solr.StandardTokenizerFactory,因为 StandardTokenizer 使用特殊字符作为单词边界。在这种情况下,您需要开始考虑何时要将文本拆分为单词。

    此外,您使用的 WordDelimiterFilterFactory 可能会过滤掉这个字符。为了防止它这样做,您应该能够根据这个问题“How do I find documents containing digits and dollar signs in Solr?”在您的类型定义中将 & 定义为 ALPHA。

    该定义在您的 solr.WordDelimiterFilterFactory 声明中由 types="wdfftypes.txt" 表示的文件中给出。

    & => 阿尔法

    进一步阅读该文件需要如何组成

    【讨论】:

    • 感谢@Chris Eventy 的回复,我不需要 wordelimiter 工厂,我已添加它以仅在我的文本中保留 &amp;。我已将架构更改为使用带有指定令牌的 PatternTokenizer Factory 。几乎可以工作了:)
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多