2016-08-22 102 views
2

如果我搜索q = searchtext:* xxx *,它可以很好地工作,但是如果关键字有“ - ”(q = searchtext:* xxx-xx *),那么它不会给出结果。在solr查询中用特殊字符搜索通配符

复制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>

谷歌搜索好几个小时也没有找到一个解决方案。

感谢有人能帮忙。

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

+0

您正在使用关键字标记器,它将整个字段按原样处理(不会将文本分解为更小的标记)。那么q = searchtext:xxx应该不起作用,并且q = searchtext:xxx-xx将起作用,如果您有像xxx-xx这样的文本。你能证实你的模式是正确的吗? – skm

+0

实际上使用标准Tokenizer,试过关键字Tokenizer,但它不能与搜索文本:xxxx,所以我把它回到标准。 –

+0

使用标准标记器,文本xxx-xx将分解为标记xxx和xx(打开 - )。然后你可以在xxx,xx上执行搜索。如果你想查询xxx-xx,然后在你的中,你可以使用标准Tokenizer本身,但不能使用Keyword Tokenizer,因为它会将xxx-xx视为单个字段,而当索引将它分解为xxx和xx 。参考检查https://wiki.apache。org/solr/AnalyzersTokenizersTokenFilters – skm

回答

1

谢谢@skm@Gus

我已经走出来与其他的解决方案,可能不是完美的,但为我工作。

  1. 使用的标准标记生成器
  2. 然后替换所有的特殊字符

$keyword = preg_replace('/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:]+/', ' ', $keyword);

  • 制动用空格字符串并进行以下查询关键字“破折号”:
  • status:1 AND(searchtext:* dash * AND searchtext:* issue *)。

    因为searchtext包含所有可搜索的文本,因此它运行良好,它会找到包含短划线和短划线的文档,并在不同的行或角中发布。

    0

    你说通配符,但似乎你的例子并不包含通配符。假设你正在寻找“通配符”搜索(在任何提供的末尾都带有通配符),可能会发现前缀查询解析器有帮助。它的工作原理是这样的:

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

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

    +0

    在solrconfig中有什么我需要做的。 xml使用前缀查询解析器 –

    +0

    不,应该如图所示。 – Gus

    +0

    编辑完成后,我发现您正在寻找不太容易的中缀搜索。但是,我会在此解决这个问题,以解决更简单的前缀问题 – Gus