2011-12-12 81 views
0

OK怪異的行爲,Lucene.Net - 在不同勢服務器

,所以我在寫一個搜索我們的網站之一:(點A)

BooleanQuery booleanQuery = new BooleanQuery(); 

    foreach (var field in fields) 
    { 
     QueryParser qp = new QueryParser(field, new StandardAnalyzer()); 
     Query query = qp.Parse(search.ToLower() + "*"); 
     if (field.Contains("Title")) { query.SetBoost((float)1.8); } 
     booleanQuery.Add(query, BooleanClause.Occur.SHOULD); 
    } 

    // CODE DIFFERENCE IS HERE 
    Query query2 = new TermQuery(new Term("StateProperties.IsActive", "True")); 
    booleanQuery.Add(query2, BooleanClause.Occur.MUST); 
    // END CODE DIFFERENCE 

    Lucene.Net.Search.TopScoreDocCollector collector = Lucene.Net.Search.TopScoreDocCollector.create(21, true); 

    searcher.Search(booleanQuery, collector); 
    hits = collector.TopDocs().scoreDocs; 

這是按預期工作。 由於我們擁有幾個網站,他們使用相同的骨架, 我上傳搜索到另一個網站(站點B) 但搜索停止返回結果。 打一場與代碼了一下,我設法讓後它的工作就像這樣:(只顯示代碼rewriten線)

QueryParser qp2 = new QueryParser("StateProperties.IsActive", new StandardAnalyzer()); 
Query query2 = qp2.Parse("True"); 
booleanQuery.Add(query2, BooleanClause.Occur.MUST); 

人知道爲什麼會這樣? 我已經檢查了Lucene的dll版本,並且它在這兩個站點的版本相同(2.9.2.2)

是我寫在站點代碼錯了?是SITE B代碼錯誤? 這是我的錯嗎?可以生產服務器這樣的東西嗎?

回答

1

它們在磁盤上沒有單獨的索引嗎?如果他們的索引不同,他們也會返回不同的結果。有一點可以想到,如果存在某種區分大小寫敏感性的問題,因爲TermQuery將查找一個EXACT匹配,因爲解析器將嘗試根據分析器對搜索項進行標記/過濾(可能搜索「真」而不是「真」

+0

他們確實有單獨的索引(總共不同的網站,具有相同的功能),但他們被索引的方式相同,數據也是一樣的,你可以看看它,就像我索引'BOOK A'在兩個索引中都有相同的屬性,但其中一個有效,另一個不起作用。 – Dementic

+1

最近都重新編制索引?意思是,刪除一個文檔並重新生成一個文檔?因爲舊索引條目不會改變,如果你修改索引過程但不重新索引整個事情,但你可能知道,我只是猜測它是你的新代碼的分析器部分,使它工作,一個d在索引文件中得出某種區別。你用盧克檢查了數據嗎? – jishi

+0

jishi是正確的,它與你原來的代碼不起作用的原因是你不用QueryParser解析「True」,它會用StandardAnalyzer處理它,它會將它轉換爲「true」(小寫) –

相關問題