2012-03-04 6 views
1

私の目標は、後で検索できるようにファイルのPATHをインデックス化することです。 は、私は次のコードを持っている:検索フィールドとしてファイルパスを使用しているときに検索結果を取得できません - Lucene.NET 2.9

class Program 
{ 
    static void Main(string[] args) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
     var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); 
     writer.Optimize(); 
     writer.Commit(); 
     writer.Close(); 
     String text1 = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"; 
     WriteDocument(text1); 
     SearchSomething("C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"); 
     Console.ReadLine(); 
    } 

    private static void WriteDocument(String text) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); 
     string[] DEFAULT_STOP_WORDS = { }; 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29, DEFAULT_STOP_WORDS); 
     var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); 
     var doc = new Document(); 
     doc.Add(new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED));//text = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt" 
     writer.AddDocument(doc); 
     writer.Optimize(); 
     writer.Commit(); 
     writer.Close(); 
    } 

    private static void SearchSomething(String searchText) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); 
     string[] DEFAULT_STOP_WORDS = { }; 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29, DEFAULT_STOP_WORDS); 
     var parser = new QueryParser(Version.LUCENE_29, "path", analyzer); 
     Query query = parser.Parse(searchText); 
     //searchText = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt" 
     //but query = {C:usersmartodesktopfolder1file1.txt} 
     var searcher = new IndexSearcher(directory, true); 
     TopDocs topDocs = searcher.Search(query, 500); 
     int results = topDocs.ScoreDocs.Length; 
     Console.WriteLine("Found {0} results", results); 
     for (int i = 0; i < results; i++) 
     { 
      ScoreDoc scoreDoc = topDocs.ScoreDocs[i]; 
      float score = scoreDoc.Score; 
      int docId = scoreDoc.Doc; 
      Document doc = searcher.Doc(docId); 
      Console.WriteLine("Result num {0}, score {1}", i + 1, score); 
      Console.WriteLine("Text found: {0}\r\n", doc.Get("path")); 
     } 
     searcher.Close(); 
     directory.Close(); 
    } 

} 

をしかし、私は「C:\ Users \ユーザー・マルト\デスクトップ\ folder1の\ FILE1.TXT」を検索する場合、クエリは、文字を削除\し、任意の結果を返しません。

他のアナライザーも試してみますが、同じ結果が得られます。 もし私が助けてくれるなら、私は非常に感謝しています!!!

+0

ファイルパスなどの場合は、KeywordAnalyzerを使用する必要があります。 – ffriend

+0

私はKeywordAnalyzerでも試しましたが、何も起こりません。 – Marto

答えて

0

次のようにあなたがあなたの「パス」フィールドを作成します。

new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED) 

をあなたの最後の引数(Field.Index.NOT_ANALYZED)がインデックスにこのフィールドをLuceneのではなく伝えます。 Luceneは索引ベースの検索エンジンなので、索引付けされていないと検索できません。あなたは、インデックス時にField.Index.NOT_ANALYZEDを指定したためである

new Field("path", text, Field.Store.YES, Field.Index.ANALYZED) 
+1

が間違っていますが、Field.Index.NOT_ANALYZEDはまだ索引付けされていますが、分析されていません。ドキュメントから:「アナライザを使用せずにフィールドの値を索引するので、検索することができます。アナライザを使用しないため、値は単一の用語として格納されます。これは、製品番号などの固有のIDに役立ちます。 –

0

をしますが、検索時にアナライザを使用している:それはちょうどField.Index.ANALYZEDにこの引数を変更する修正するには。

ルーケンでは、データを索引付けしたのと同じ方法で検索する必要があります。 QueryParserを作成するときは、StandardAnalyzerではなくKeywordAnalyzerを使用するか、インデックス時にフィールドをField.Index.ANALYZEDに変更してください。

0

まあ、ついにそれを手に入れました。 解決策はField.Index.NOT_ANALYZEDを使用していたため、分析装置は処理しません。そして、BooleanQueryを使って、TermQueryを追加しました(通常はQueryを使用するのではなく)ので、解析する必要はありません。

ありがとうございます。

0

ソリューション:すべてのアイデアを

class Program 
{ 
    static void Main(string[] args) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo(this.IndexPath)); 
     StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
     var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); 
     writer.Optimize(); 
     writer.Commit(); 
     writer.Close(); 
     String text1 = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"; 
     WriteDocument(text1); 
     SearchSomething("C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"); 
     Console.ReadLine(); 
    } 

    private static void WriteDocument(String text) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); 
     StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
     IndexWriter writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); 
     Document doc = new Document(); 
     doc.Add(new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED)); 
     writer.AddDocument(doc); 
     writer.Optimize(); 
     writer.Commit(); 
     writer.Close(); 
    } 

    private static void SearchSomething(String searchText) 
    { 
     Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); 
     StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 
     IndexSearcher searcher = new IndexSearcher(directory, true); 

     int results = 0; 
     if (searcher.MaxDoc() > 0) 
     { 
      BooleanQuery booleanQuery = new BooleanQuery(); 
      Lucene.Net.Search.Query query1 = new WildcardQuery(new Term("path", searchText)); 
      booleanQuery.Add(query1, BooleanClause.Occur.SHOULD); 

      TopDocs topDocs = searcher.Search(booleanQuery, searcher.MaxDoc()); 
      results = topDocs.ScoreDocs.Length; 

      Console.WriteLine("Found {0} results", results); 
      for (int i = 0; i < results; i++) 
      { 
       ScoreDoc scoreDoc = topDocs.ScoreDocs[i]; 
       float score = scoreDoc.Score; 
       int docId = scoreDoc.Doc; 
       Document doc = searcher.Doc(docId); 
       Console.WriteLine("Result num {0}, score {1}", i + 1, score); 
       Console.WriteLine("Text found: {0}\r\n", doc.Get("path")); 
      } 

     } 
     searcher.Close(); 
     directory.Close(); 
    } 

} 

感謝!

関連する問題