2015-11-09 45 views
1

我們已經使用Apache lucene實現了對搜索課程的搜索。它工作正常。但是,我有兩條記錄,分別是「製造人員」和「做正確的事情」。當我搜索「make」「personnel」時,我正在獲得結果,但當我搜索「make it」時,找不到結果。但它與「做它」運作良好!我真的很困惑,爲什麼它不適合「成功」。 BTW查詢分析器定義如下,C# - Lucene搜索不適用於少數字符串文字

private readonly StandardAnalyzer _analyzer; 
_analyzer = new StandardAnalyzer(Version.LUCENE_29); 
var parser = new MultiFieldQueryParser(Version.LUCENE_29, new[] { "Name",  "Description", "Id" }, _analyzer); 

var queryParser = parseQuery(BuildPrefixQuery(input), parser); 

var hits = searcher.Search(queryParser, null, 50, Sort.RELEVANCE).ScoreDocs; 

&和索引創建的代碼是

public void CreateIndex(List<ILucenceProperties> ListILucenceProperties) 
    { 
var writer = new IndexWriter(_directory, _analyzer, true,  IndexWriter.MaxFieldLength.UNLIMITED); 

     foreach (var iLucenceProperties in ListILucenceProperties) 
     { 
      var document = new Document(); 

      document.Add(new Field("Id", iLucenceProperties.Id, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Name", iLucenceProperties.Name, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Description", iLucenceProperties.Description, Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new Field("Category", iLucenceProperties.Category, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("FilterID", iLucenceProperties.FilterID, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("ColumnName", iLucenceProperties.ColumnName, Field.Store.YES, Field.Index.NO)); 
      document.Add(new Field("AdditionalSearchParameter", iLucenceProperties.AdditionalSearchParameter, Field.Store.YES, Field.Index.NO)); 
      writer.AddDocument(document); 
     } 

     writer.Optimize(); 
     writer.Dispose(); 
    } 

以上,「名稱」字段包含課程的名稱,「ID」含有當然的ID,「說明「當然包含另一個ID等等。

這是我的想法,問題可能是解析器/分析器。請幫助我。

+0

我認爲我們需要看到更多的代碼,特別是實際上與查詢匹配的代碼,甚至可能會向我們展示一些真正的(如果可能的話)示例數據,其中實際使用這些關鍵字。 – username

回答

0

StandardAnalyzer將停用詞過濾掉,如「it」。但是當你搜索時,你會將「it」當作關鍵字。您可以使用帶有停用詞列表的StandardAnalyzer constructor,並用一個空集調用它。

+0

超級!謝謝。以下更改工作。 _analyzer =新的StandardAnalyzer(Version.LUCENE_29,CharArraySet.EMPTY_SET); – Naveenk

+0

但對於諸如「html/java編程」這樣的課程來說,這是行不通的。即當特殊字符「\」或「/」是課程名稱的一部分時。我們只允許這些特殊字符成爲課程名稱的一部分。你能幫我解決嗎? – Naveenk

+0

您可以嘗試轉義特殊字符,或嘗試另一個標記器。參見[this](http://stackoverflow.com/questions/6107875/how-to-search-special-characters-in-lucene)。 – Tamas