2016-08-22 101 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