Фильтр индекса для поиска в Lucene.net - PullRequest
0 голосов
/ 14 июля 2011

В настоящее время я работаю над проектом, включающим библиотеку Lucene в C #, однако у меня возникла проблема с дизайном моего проекта, касающегося пересмотра документов в индексе. Документы в моем индексе были созданы с несколькими полями, и я хотел бы иметь возможность фильтровать между двумя из этих полей и затем искать в этом подмножестве термины, однако я все еще знакомлюсь с Lucene и не совсем уверен, возможно ли это , Я научился выполнять основные запросы, но я думаю, что должен использовать класс фильтра lucenes, но я не совсем уверен, как. Буду признателен, если кто-нибудь сможет дать совет по этому вопросу

Проект, который я завершаю, включает в себя индексирование сообщений электронной почты от различных учетных записей электронной почты. документы в моем индексе имеют некоторые из следующих полей: Аккаунт: (например, fake@fake.com) Папка: (например, отправлено, корзина, входящие ...) Данные: (тело письма)

Я бы хотел иметь возможность фильтровать свой индекс, чтобы у меня было подмножество, содержащее только документы из определенной учетной записи и папки, а затем после этого я хотел бы иметь возможность поиска в поле данных этого подмножества.

1 Ответ

4 голосов
/ 19 июля 2011

Как предположил @Jf Beaulac, вы можете выполнить "фильтрацию" с помощью BooleanQuery.

private Query CreateFilteredQuery (string account, string folder, Query criteria)
{
     BooleanQuery bq = new BooleanQuery();
     bq.Add(new TermQuery (new Lucene.Net.Index.Term ("account", account)), BooleanClause.Occur.MUST);
     bq.Add(new TermQuery (new Lucene.Net.Index.Term ("folder", folder)), BooleanClause.Occur.MUST);
     bq.Add(criteria, BooleanClause.Occur.MUST);
     return bq;
}


Query filteredQuery = CreateFilteredQuery ("fake@fake.com", "inbox", myQueryParser.Parse (criteria));
var hits = myIndexSearcher.Search (filteredQuery);

Вот хороший вопрос о различиях между запросами и фильтрами: Почему мы используем фильтры при поиске

...