Организация Лунного справочника - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть набор записей. Каждая запись может иметь несколько навыков и одно состояние.

Таким образом, у вас может быть список навыков a, b и c и штата Виктория.

Мне нужно иметь возможность искать в каталоге любые записи, в которых есть скилл a в Виктории или a и c в Виктории.

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

Сначала я создал каталог с 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.

Есть мысли?

EDIT

С тех пор, как я опубликовал это, я получил его на работу, но не уверен, что это правильный подход.

Я объединил все навыки в одном поле и разделил их. Навыки в формате GUID.

Тогда в моем методе поиска я делаю это;

queryString = "skills:(skill1 OR skill2 OR skill3) AND state:Vic";
Query query = parser.Parse(queryString);

Это прекрасно работает, и это очень быстро, но действительно ли создание queryString является подходом для этого или есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 23 августа 2012

Вы можете создать свой 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"
0 голосов
/ 20 апреля 2011

Вы можете использовать BooleanQuery: http://geekswithblogs.net/rgupta/archive/2009/01/07/lucene-multifield-searches.aspx

...