在solr查询中使用特殊字符进行通配符搜索

时间:2016-08-22 13:04:18

标签: solr

如果我搜索q = searchtext:* xxx *,它效果很好,但如果关键字有“ - ”(q = searchtext:* xxx-xx *),则它不会给出结果。

复制searchtext字段中的所有字段,并在其上包含text_general字段类型。

架构:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ReversedWildcardFilterFactory" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        <filter class="solr.PorterStemFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>

谷歌搜索了几个小时但找不到解决方案。

感谢有人可以提供帮助。

编辑:将关键字标记生成器更改为标准

2 个答案:

答案 0 :(得分:1)

感谢您@skm@Gus

我已经提出了其他解决方案,可能不是完美但对我有用。

  1. 使用标准标记符
  2. 然后替换所有特殊字符
  3. &#13;
    &#13;
     $keyword = preg_replace('/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:]+/', ' ', $keyword);
    &#13;
    &#13;
    &#13;

    1. 用空格制作字符串,然后查询关键字&#34; dash-issue&#34;:
    2. 状态:1 AND(searchtext:* dash * AND searchtext:* issue *)。

      因为searchtext包含所有可搜索的文本,所以它运行良好,它会找到包含破折号问题和破折号的文档,并在不同的行或角落发布。

答案 1 :(得分:0)

你说通配符,虽然你的例子似乎没有包含通配符。假设您正在寻找“通配符”搜索(在提供的任何内容的末尾使用通配符)可能会发现前缀查询解析器有用。它的工作原理如下:

q="{!prefix f=searchtext}xxx-xx"

您可以阅读更多相关信息here。它不进行分析或值转换,因此它通常有助于包含可能混淆标准查询解析器的空格或其他值的情况。