2011-05-06 41 views
4

我正在玩Lucene.net試圖獲得如何在我的應用程序中實現它的句柄。當在搜索中使用多個單詞時,如何在Lucene.net中執行AND搜索?

我有以下代碼

  ..... 
      // Add 2 documents 
      var doc1 = new Document(); 
      var doc2 = new Document(); 

      doc1.Add(new Field("id", "doc1", Field.Store.YES, Field.Index.ANALYZED)); 
      doc1.Add(new Field("content", "This is my first document", Field.Store.YES, Field.Index.ANALYZED)); 
      doc2.Add(new Field("id", "doc2", Field.Store.YES, Field.Index.ANALYZED)); 
      doc2.Add(new Field("content", "The big red fox jumped", Field.Store.YES, Field.Index.ANALYZED)); 

      writer.AddDocument(doc1); 
      writer.AddDocument(doc2); 

      writer.Optimize(); 
      writer.Close(); 

      // Search for doc2 
      var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); 
      var query = parser.Parse("big abcdefg test1234"); 
      var searcher = new IndexSearcher(indexDirectory, true); 
      var hits = searcher.Search(query); 

      Assert.AreEqual(1, hits.Length()); 

      var document = hits.Doc(0); 

      Assert.AreEqual("doc2", document.Get("id")); 
      Assert.AreEqual("The big red fox jumped", document.Get("content")); 

該測試通過,這dismays我有點。我認爲這意味着Lucene.Net使用OR進行術語之間的搜索,而不是AND,但我無法找到關於如何實際執行AND搜索的任何信息。

我要做的最終結果是,如果有人搜索「馬修安德森」,我不希望它提出引用「馬修多恩」的文檔,因爲這與任何形式都不相關,形狀或形成。

回答

6

答:如果您需要的所有單詞是一個文檔中,但不要求的話是連續和順序指定:查詢

+big +red 

比賽

* the big red fox jumped 
* the red big fox jumped 
* the big fast red fox jumped 

但不匹配

* the small red fox jumped 

B.如果你想匹配一個短語(即需要所有單詞;的話必須是連續的,並在指定的順序),而不是:查詢

+"big red" 

比賽

* the big red fox jumped 

但不匹配

* the red big fox jumped 
* the big fast red fox jumped 
* the small red fox jumped 
+1

確定這是有道理的。因爲你給了我連續匹配的例子,所以將其標記爲答案。我想我需要編寫一個字符串分析器來將用戶輸入轉換爲正確的lucene查詢字符串,這應該很有趣。 – KallDrexx 2011-05-07 00:39:27

+0

很久沒有問了。如果我想要返回數據,如果有foudn這個詞叫紅色但是大不存在或者大,但是紅色不存在,那麼查詢應該如何。 – Thomas 2014-07-14 09:13:19

+0

@Thomas查詢語法支持用圓括號分組子句。所以,這應該工作:'(+ red-big)(+ big -red)' – 2014-07-14 22:52:18

2

當您的查詢是var query = parser.Parse("+big +abcdefg +test1234");時,您會得到什麼這應該會導致解析器要求所有條款出現在匹配的文檔中。另一種可能性是以編程方式構建查詢。

BooleanQuery query = new BooleanQuery(); 
query.add(new BooleanClause(new TermQuery(new Term("field", "big"))), Occur.MUST); 
query.add(new BooleanClause(new TermQuery(new Term("field", "abcdefg"))), Occur.MUST); 
query.add(new BooleanClause(new TermQuery(new Term("field", "test1234"))), Occur.MUST);