2013-05-24 3 views
1

Позвольте мне объяснить мою проблему. Я использую Lucene для поиска и отображения результатов на веб-странице asp.net. Когда я ищу, Lucene отображает все записи, связанные с моим поиском. Например, у меня 5000 записей с именем John. Если я нахожу John, он отображает все эти 5000 записей. Я хочу ограничить эти 5000 записей на основе другого атрибута. У меня есть четыре атрибута: Имя, Фамилия, ДОБ и ИД. Из этих 5000 записей я хочу, чтобы пользователь отображал только те, у которых введенный DOB. Это означает, что вы просто показываете записи john, у которых есть DOB как 5/12/1998. Это ограничит результат примерно 50 записями. Как только я закончил с этим, я хочу искать все поля, у которых одинаковый идентификатор, и затем отображать эти записи. В конце концов, у меня будут записи Джона с данным DOB и тем же ID.Результаты поиска в 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'. Для удостоверения личности я боюсь, что Lucene не поддерживает этот тип операции. Вы всегда можете извлекать записи и фильтровать их снова ... – rae1

+0

@ rae1n Как я уже говорил, это делается для целей безопасности. Я не хочу, чтобы пользователь вводил его. Я ищу что-то вроде этого. Фильтр LEA = новый QueryWrapperFilter (новый TermQuery (новый термин («5/12/1998», поле)) ;. Однако я не думаю, что правильно задаю фильтр. – Huzaifa

+0

Я имел в виду, что вам не нужно указывать фильтр за отзыв, просто добавьте предложение AND к вашему запросу с помощью 'DOB: 5/12/1998'. Вы можете использовать '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

Смежные вопросы