2013-05-24 1 views
1

내 문제를 설명해 드리겠습니다. Lucene을 사용하여 asp.net 웹 페이지에서 결과를 검색하고 표시합니다. 내가 검색 할 때 Lucene은 내 검색과 관련된 모든 레코드를 표시하고 있습니다. 예를 들어, John이라는 이름의 5000 개의 레코드가 있습니다. 제가 John을 입력하면이 5000 개의 모든 레코드가 표시됩니다. 다른 속성에 따라이 5000 개의 레코드를 제한하려고합니다. 성, 성, DOB 및 신분증이라는 네 가지 속성이 있습니다. 이 5000 개의 레코드 중에서 사용자가 입력 한 DOB가있는 레코드 만 표시하려고합니다. 이것은 DOB가있는 1999 년 5 월 12 일 존의 레코드 만 표시한다는 것을 의미합니다. 결과가 약 50 개로 제한됩니다. 일단 내가 끝나면 동일한 ID를 가진 모든 필드를 검색 한 다음 해당 레코드를 표시하려고합니다. 결국 나는 주어진 DOB와 동일한 신분증을 가진 John의 기록을 갖게 될 것입니다.Lucene 검색 결과 필터링

참고 : DOB로 필터링하는 것은 보안을위한 것입니다.

다음은 검색 코드입니다.

 List<SearchResults> Searchresults = new List<SearchResults>(); 


     string indexFileLocation = @"C:\o"; 
     Lucene.Net.Store.Directory dir =  Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation); 

     string[] searchfields = new string[] { "fname", "lname", "dob", "id"}; 
     IndexSearcher indexSearcher = new IndexSearcher(dir); 

     var hits = indexSearcher.Search(QueryMaker(searchString, searchfields)); 

     for (int i = 0; i < hits.Length(); i++) 
     { 
      SearchResults result = new SearchResults(); 
      result.fname = hits.Doc(i).GetField("fname").StringValue(); 
      result.lname = hits.Doc(i).GetField("lname").StringValue(); 
      result.dob = hits.Doc(i).GetField("dob").StringValue(); 
      result.id = hits.Doc(i).GetField("id").StringValue(); 
      Searchresults.Add(result); 

     } 

문의 사항이 있으면 알려 주시기 바랍니다.

+0

'FirstName : John AND DOB : 5/12/1998'을 (를) 검색하여 검색 할 필드를 지정할 수 있습니다. ID에 대해서는 Lucene이 그 유형의 작업을 지원하지 않는다는 것을 두려워합니다. 언제든지 레코드를 가져 와서 다시 필터링 할 수 있습니다 ... – rae1

+0

@ rae1n 보안 목적으로 전에 말했던 것처럼. 나는 사용자가 그것을 입력하는 것을 원하지 않는다. 나는 이와 같은 것을 찾고있다. 필터 LEA = new QueryWrapperFilter (new TermQuery (새 용어 ('5/12/1998', 필드))) ;. 그러나, 나는 필터를 정확하게 지정하고 있다고 생각하지 않는다. – Huzaifa

+0

필자가 말한 것은 필터를 지정할 필요가 없다는 것입니다. 단지 'DOB : 5/12/1998' 쿼리와 AND 절을 추가하기 만하면됩니다. 'BooleanQuery'를 사용하여 두 개의 질의를 지정할 수 있습니다. – rae1

답변

3

나는 이것을하기가 싫다. 하지만 그 대답을 찾았습니다.

Filter fil= new QueryWrapperFilter(new TermQuery(new Term(field, "5/12/1998"))); 
var hits = indexSearcher.Search(QueryMaker(searchString, searchfields), fil); 

당신은 위의 코드를 사용하여 결과를 필터링 할 수 있습니다.

나는 값을 찾기 위해 필터링 한 후에 되돌릴 수는 없다고 생각합니다. 아무도 동의하지 않습니까?

+0

이것은 실제로 작동하는 정말 간단한 솔루션입니다. 내가 좋아하는 종류 :) – MartinJH