2013-01-31 67 views
0

Solr的通配符搜索我試圖運行一些通配符與布爾運算符搜索。當我運行下面的查詢,我得到了相應的結果: -與布爾運算符

q=field1:*val1 val2* AND field2:val3 

上面顯示所有的記錄,其中val1和任意組合VAL2發生在Field 1和Field2包含的價值VAL3。

但是,如果我運行下面的查詢: -

q=field1:*val1 val2* AND field2:val3 AND -field3:(*val1 val2* *:*) 

FIELD1搜索開始行爲異常。據我理解debugQuery結果是,上述查詢第一搜尋這些記錄,其中任一VAL1或val2的(或兩者)中出現FIELD1,通過FIELD2對其過濾,然後過濾,其中場3不包含的組合這些記錄val1和val2。所以,這個查詢可以顯示那些val2(而不是val1)出現在field1中的記錄。

我試圖接近搜索也FIELD1。沒有效果。但後來,我讀到鄰近搜索不適用於通配符。

字段上面的定義如下: -

<field name="field1" type="text_general" indexed="true" stored="false" multiValued="true" /> 
<field name="field2" type="text_general" indexed="true" stored="false" /> 


<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="select"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 

    </fieldType> 

字段3是一個字符串,它是不給任何問題。是否有可能修改上述查詢,以便對FIELD1搜索只導致那些其中兩個val1和val2的存在(任何組合是可接受的)記錄?

更新:它工作時,我做了以下內容: -

q=field1:*val1 AND field1:val2* AND field2:val3 AND -field3:(*val1 val2* *:*) 

但是,有沒有辦法做到沒有我的短語拿刀砍到個別單詞的一樣嗎?

回答

0

你說:

field1:*val1 val2* 

搜索任何東西都是val1和val2的都發生。除非你自己實現了這個語法,否則我無法在Lucene或Solr中找到任何此類語法的文檔。它應搜索:

field1:*val1 OR defaultfield:val2* 

如果您想尋找兩者在field1的存在(不知道您打算如何完成的通配符,但留給他們是暫時):

field1:(+*val1 +val2*) 

此外,-field3:(*val1 val2* *:*)意味着你會忽略的是包含*val1val2**:*,所有的結果和去年我讀含有冒號什麼,我不知道它是否會正常工作。

field1:(*val1 AND val2*) AND field2:val3 AND -field3:(*val1 val2* *:*) 

或(因爲我必須爲我的首選查詢語法作爲替代,至少):

+field1:(+*val1 +val2*) +field2:val3 -field3:(*val1 val2* *:*)