#lucene #lucene.net
#lucene #lucene.net
Вопрос:
У меня есть набор записей. Каждая запись может иметь несколько навыков и одно состояние.
Таким образом, у вас может быть список навыков a, b и c и статус штата Виктория.
Мне нужно иметь возможность искать в каталоге любые записи, в которых есть, скажем, навык a в Victoria или навыки a и c в Victoria.
У меня возникли проблемы с созданием эффективного каталога, который позволит мне выполнять поиск так, как я хочу.
Сначала я создал каталог с помощью skills: a b c state:vic
затем я попытался skills: a,b,c state:vic
Но поиск в них не дает мне правильных результатов. На самом деле, когда у меня есть запрос;
skills:a,b AND state:vic,
skills: a OR b AND state:vic,
skills: a OR skills:b AND state:vic
все вышеперечисленное возвращает набор записей для skills: a AND state:vic
.
Есть мысли?
Редактировать
С момента публикации этого я заставил это работать, но не уверен, что это правильный подход.
Я объединил все навыки в одном поле и разделил их пробелом. Навыки представлены в формате GUID.
Затем в моем методе поиска я делаю это;
queryString = "skills:(skill1 OR skill2 OR skill3) AND state:Vic";
Query query = parser.Parse(queryString);
Это отлично работает и выполняется очень быстро, но действительно ли создание строки запроса является правильным решением или есть способ получше?
Ответ №1:
Вы можете использовать логический запрос :http://geekswithblogs.net/rgupta/archive/2009/01/07/lucene-multifield-searches.aspx
Комментарии:
1. Я действительно пробовал это, да, и получил точно такие же результаты. Я добился некоторого успеха с момента публикации этого и добавил это к своему вопросу
Ответ №2:
Вы могли бы создавать свой BooleanQuery
напрямую, вместо того, чтобы переходить через QueryParser
. Это требует от вас различных навыков ввода и состояния полей ввода при представлении вашего интерфейса поиска вашим пользователям.
var skillQuery = new BooleanQuery {
{ new TermQuery(new Term("skills", "skill1")), Occur.SHOULD },
{ new TermQuery(new Term("skills", "skill2")), Occur.SHOULD },
{ new TermQuery(new Term("skills", "skill3")), Occur.SHOULD }
};
var query = new BooleanQuery() {
{ skillQuery, Occur.MUST },
{ new TermQuery(new Term("state", "Vic")), Occur.MUST }
};
// query = " (skills:skill1 skills:skill2 skills:skill3) state:Vic"
Для разрешения ввода свободного текста при поиске навыков по-прежнему требуется вызов QueryParser.Parse
.
var analyzer = new StandardAnalyzer(Version.LUCENE_30);
var skillParser = new QueryParser(Version.LUCENE_30, "skills", analyzer);
var skillQuery = skillParser.Parse("skill1, skill2, skill3");
var query = new BooleanQuery() {
{ skillQuery, Occur.MUST },
{ new TermQuery(new Term("state", "Vic")), Occur.MUST }
};
// query = " (skills:skill1 skills:skill2 skills:skill3) state:Vic"