Организация каталога Lunene

#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"