2017-02-20 8 views
0

私はLuceneにいくつかの問題を抱えています。Luceneの問題検索フィールドのハイフネーション

doc.Add(new Field("cataloguenumber", i.CatalogueNumber.ToLower(), Field.Store.YES, Field.Index.ANALYZED)); 

次のようなものに見えるカタログ番号が含まれます:

  • DF-GH5
  • DF-FJ4
  • DF-DOG
  • ACを私は、次のフィールドを持っています-DP
  • AC-123
  • AC-DOCO

2文字の後にハイフンが続き、その後に2〜5文字の英数字が続きます。

私は、ユーザーがデータ上で検索できるようにブールクエリを実行しようとしています:

// specify the search fields, lucene search in multiple fields 
     string[] searchfields = new string[] { "cataloguenumber", "title", "author", "categories", "year", "length", "keyword", "description" }; 

     // Making a boolean query for searching and get the searched hits     
     BooleanQuery mainQuery = new BooleanQuery(); 
     QueryParser parser; 

     //Add filter for main keyword 
     parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, searchfields, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); 
     parser.AllowLeadingWildcard = true; 
     mainQuery.Add(parser.Parse(GetMainSearchQueryString(SearchPhrase)), Occur.MUST); 

システムが何らかの理由ですべての作業をされていないcataloguenumberを除くすべてのフィールドに対して正常に動作しています。 「DF-」

は、誰もが、私はこの作品を作ることができる方法を知っていDF

接頭辞のすべてのアイテムを返す必要があります例えばので

理想的には、完全または部分的cataloguenumberで検索できるようにしたいですか?非常に事前に

オリー

+0

それは私が_mcd.cfsファイルを開いたと私はそこ –

答えて

0

おかげで問題の共通のソースは、インデックス・タイムと問合せ時間に異なるのアナライザを使用することです。 StandardAnalyzerを使用すると良い結果が得られるはずです。テキストDF-GH5を1つのトークンとして扱うので、fx df-gh5またはdf-*で検索できますが、IndexWriterQueryParserには必ず使用してください。

ここでは、単一のドキュメントでインメモリインデックスを作成し、インデックスをcataloguenumberでクエリする簡単な例を示します。

public static void Test() 
{ 
    // Use an in-memory index. 
    RAMDirectory indexDirectory = new RAMDirectory(); 

    // Make sure to use the same analyzer for indexing 
    Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 

    // Add single document to the index. 
    using (IndexWriter writer = new IndexWriter(indexDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED)) 
    { 
     Document document = new Document(); 
     document.Add(new Field("content", "This is just some text", Field.Store.YES, Field.Index.ANALYZED)); 
     document.Add(new Field("cataloguenumber", "DF-GH5", Field.Store.YES, Field.Index.ANALYZED)); 

     writer.AddDocument(document); 
    } 

    var parser = new MultiFieldQueryParser(
     Lucene.Net.Util.Version.LUCENE_30, 
     new[] { "cataloguenumber", "content" }, 
     analyzer); 

    var searcher = new IndexSearcher(indexDirectory); 

    DoSearch("df-gh5", parser, searcher); 
    DoSearch("df-*", parser, searcher); 
} 

private static void DoSearch(string queryString, MultiFieldQueryParser parser, IndexSearcher searcher) 
{ 
    var query = parser.Parse(queryString); 

    TopDocs docs = searcher.Search(query, 10); 

    foreach (ScoreDoc scoreDoc in docs.ScoreDocs) 
    { 
     Document searchHit = searcher.Doc(scoreDoc.Doc); 
     string cataloguenumber = searchHit.GetValues("cataloguenumber").FirstOrDefault(); 
     string content = searchHit.GetValues("content").FirstOrDefault(); 
     Console.WriteLine($"Found object: {cataloguenumber} {content}"); 
    } 
} 
+0

魅力のように作業するには、いくつかのカタログ番号を見ることができるので、私は(何らかの形で)このフィールドがインデックス化されている知っていると付け加えた価値があります!どうもありがとうございます! –

関連する問題