2017-01-11 2 views
0

Lucene 색인에 대해 몇 가지 쿼리를 수행하고 있습니다. 지금은이 쿼리를 통해 라틴어 구문을 찾고 있습니다. 문제는이 문구 중 일부에 마개처럼 생각하는 단어가 포함되어 있다는 것입니다. 예를 들어 검색어가 "contrario sensu"인 경우 결과는 0입니다. 그러나 "contrario sensu"만 검색하면 나는 100 회 이상의 우연한 일치를 보입니다.Lucene 색인 마개가없는 채로 검색

질문은 어떻게이 마개가없는 검색을 할 수 있습니까?

내 코드는 내가 인덱스를 작성하고 검색

답변

0

그것은 정지 단어를 수행 할 StandardAnalyzer을 사용하여이

public IEnumerable<TesisIndx> Search(string searchTerm) 
{ 
     List<TesisIndx> results = new List<TesisIndx>(); 

     IndexSearcher searcher = new IndexSearcher(FSDirectory.GetDirectory(indexPath)); 
     QueryParser parser = new QueryParser("Rubro", analyzer); 


     PhraseQuery q = new PhraseQuery(); 
     String[] words = searchTerm.Split(' '); 

     foreach (string word in words) 
     { 
      q.Add(new Term("Rubro", word)); 
     } 

     //Query query = parser.Parse(searchTerm); 
     Hits hitsFound = searcher.Search(q); 

     TesisIndx sampleDataFileRow = null; 

     for (int i = 0; i < hitsFound.Length(); i++) 
     { 
      sampleDataFileRow = new TesisIndx(); 
      Document doc = hitsFound.Doc(i); 
      sampleDataFileRow.Ius = int.Parse(doc.Get("Ius")); 
      sampleDataFileRow.Rubro = doc.Get("Rubro"); 
      sampleDataFileRow.Texto = doc.Get("Texto"); 


      results.Add(sampleDataFileRow); 
     } 
} 

것 같습니다. 그러나 구문 쿼리에 관해서는 그것이 전혀 고려되지 않는다는 것을 의미하지는 않습니다. "? contrario sensu"

그 물음표이 경우, 제거 된 중지 단어를 위치 증가를 나타냅니다

Rubro : 당신은 구문 분석 후 쿼리를 인쇄하려고하면 같은 것을 볼 수있다. 따라서 시작 부분에 정지 단어가 제거 된 틈이있는 문구를 찾고 있습니다.

으로 쿼리 구문 분석기에서 위치 증가분을 비활성화 할 수 있습니다. 그러나 여전히 색인에 위치 증가분이 있고 문구 중간에 정지 단어가있는 경우 문제가 발생할 수 있음을 알고 있어야합니다.

+0

구문 분석 후 쿼리를 인쇄하면 Rubro : "a contrario sensu"가 표시되므로 적어도 그 순간에 중지 단어는 제거되지 않았습니다. 나는 또한 위치 증가를 false로 설정하지만 아무 것도 바뀌지 않습니다. –

+0

@danilo_zac - 분석기 정의 방법을 보여주지 않으므로 모든 것을 할 수 있습니다. 당신은 그것에게 빈 멈춤 세트 또는 그런 것을주고 있습니까? – femtoRgon

+0

나는 분석기를 정의하기 위해 이와 같은 작업을하고 있습니다. Analyzer analyzer = new StandarAnalyzer(); –

0

StandardAnalyzer "는"(전체 목록 https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/StopAnalyzer.cs의 끝을 참조)

쿼리 분석 스타일이 사용되는 스타일과 호환되는 것이 중요 포함 중지 단어 세트를 제외됩니다 색인 생성. 이것은 귀하의 PhraseQuery가 을 사용하지 않고의 "a"를 인덱싱 단계에서 제거한 이유입니다.

당신은 ISet<string> stopWords 걸리는 StandardAnalyzer의의 ctor를 사용하고 같은 new HashSet<string>() 뭔가에 전달할 수 있습니다

new StandardAnalyzer(Version.LUCENE_30, new HashSet<string>()) 

모든 단어 필드의 토큰 스트림에 포함된다는 것을 의미합니다.

색인 생성 및 쿼리시이 분석기를 사용하면 더 나은 결과를 얻을 수 있습니다.

그러나 StandardAnalyzer도 단어를 다소 들키며주의해야합니다. "대부분의 유럽 언어 문서에 적합한 토큰 화 프로그램"이되도록 설계되었습니다. 더 많은 정보는 https://github.com/apache/lucenenet/blob/3.0.3-2/src/core/Analysis/Standard/StandardTokenizer.cs의 시작 부분에있는 주석을보고 유스 케이스와 호환되는지 확인하십시오.

인덱싱 할 텍스트의 종류에 따라 다른 분석기를 조사하는 것이 좋습니다.