2017-02-20 1 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 자 이상의 영숫자가옵니다.

나는 사용자가 데이터를 통해 검색 할 수 있도록 부울 쿼리를 실행하기 위해 노력하고있어 :
// 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을 하나의 토큰으로 처리하므로 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

매력처럼 작동 일부 제품 번호를 볼 수 있기 때문에 내가 (어떤 형태로든)이 필드가 색인 알고 있다고 덧붙였다 가치! 정말 고맙습니다! –