2012-11-07 165 views
0

我有一個Lucene索引設置,我可以很好地查詢。我只是無法獲得「字段不等於空字符串」的條件工作。例如,在下面的代碼樣本,我想有3個條件Lucene.net查詢包含和避免空字符串字段

  1. 其中 「國家標籤」 字段包含 「{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}」。
  2. 其中「country tag」字段不是空字符串。
  3. 「日期」範圍介於「20110101T000000」和「20121001T000000」之間。

    WildcardQuery taggingQuery = new WildcardQuery(new Term("country tag", "*" + ShortID.Encode("{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}").ToLowerInvariant() + "*")); 
        TermQuery taggingNotQuery = new Term("country tag", " ")); 
    
        RangeQuery rangeQuery = new RangeQuery(new Term("date", "20110101T000000"), new Term("date", "20121001T000000"), true); 
    
        BooleanQuery booleanQuery = new BooleanQuery(); 
        booleanQuery.Add(taggingQuery, BooleanClause.Occur.MUST); 
        booleanQuery.Add(taggingNotQuery, BooleanClause.Occur.MUST_NOT); 
        booleanQuery.Add(rangeQuery, BooleanClause.Occur.MUST); 
    

我有一種感覺,我這樣做不對還是我的查詢是錯誤的莫名其妙。我不應該需要一個條件,我必須注意空或空字段。

任何幫助表示讚賞!

+0

您可以顯示用於將文檔寫入沒有國家/地區的索引的代碼嗎? – Prescott

+0

您是否多次將文件標籤字段添加到文檔中?如果沒有,那麼你不需要MUST_NOT子句。順便說一句,你的MUST_NOT檢查一個空格,而不是空字符串。最後,從你所說的話,我建議你不要添加空字符串的字段,只是不要添加字段到您的文檔。 –

回答

0

設置索引時我應該多加註意。我忘了爲每個領域添加現場分析儀。多列表字段使用不同的分析器而不是標準分析器索引。我將這添加到我的配置部分進行字段抓取,並且我的查詢開始工作

<fieldTypes hint="raw:AddFieldTypes"> 
        <!-- Text fields need to be tokenized --> 
        <fieldType name="single-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="multi-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <!-- Multilist based fields need to be tokenized to support search of multiple values --> 
        <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
        <!-- Legacy tree list field from ver. 5.3 --> 
        <fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
       </fieldTypes> 
0

如果允許「*」作爲搜索字符串的第一個字符,Lucene的可以使用查詢,如「countrytag:*」來查找包含在countrytag場什麼的所有文件。 (Lucene的默認設置是禁用查詢字符串中的初始'*'。)

+0

我試圖使用WildQuery query = new WildQuery(「country tag」,「* [GUID] *」);但它不起作用。此查詢會與其他範圍和術語查詢一起添加到布爾查詢中。另外,我嘗試QueryParser來允許領先的明星,但那也沒有效果。 國家標記字段被StandardAnalyzer分析,它是一串GUID值。分析後,它添加爲「ASDF342SDFAS 2342LJLJl」,其間有空格。請注意,GUID只是樣本。實際值是沒有連字符和大括號的真GUID。我只是無法讓這個東西工作,並在我的智慧目前結束。 – Gabbar

+0

另外,我嘗試搜索的值將轉換爲分析的字段格式,例如23LKLL233。 – Gabbar