проблема при объединении нескольких запросов с логическим запросом Lucene.net (версия 2.9) - PullRequest
1 голос
/ 23 июня 2011

Я получаю проблему, когда объединяю несколько запросов с логическим запросом Lucene.net (версия 2.9).

Пожалуйста, посмотрите структуру документа, которую я проиндексировал.

ID  Make      Model     Price   MakeDate    CreatedBy
1   Ford      Fiesta    240000  06/23/2011  anil
2   Ford      Focus     250000  06/20/2011  anil
3   Vauxhall  Astra     200000  06/21/2011  anil
4   Ford      Focus LX  230000  06/21/2011  anilkumar
5   Ford      Focus XI  260000  06/20/2011  anil

Мое намерение - получить записи, которые содержат focus в любом из полей, например, в полях Model или Make, .. иCreatedBy равно Anil.

Для этого я написал следующие запросы:

WildcardQuery query4 = new WildcardQuery(new Term("Make", "*focus*"));
WildcardQuery query5 = new WildcardQuery(new Term("Model", "*focus*"));

var queryParser3 = new QueryParser(Version.LUCENE_29, "CreatedBy", analyzer1);
var query3 = queryParser3.Parse("anil");

objBool.Add(query3, BooleanClause.Occur.MUST);
objBool.Add(query4, BooleanClause.Occur.SHOULD);
objBool.Add(query5, BooleanClause.Occur.SHOULD);

Когда я выполню это, на самом деле мне нужно получить только две записи, то есть 2-ю и 5-ю.Но я получаю четыре записи, то есть, кроме 4-го.

Насколько я понимаю, он возвращает все записи, которые CreatedBy равны Anil.

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

Ответы [ 2 ]

3 голосов
/ 25 июня 2011

Вам нужно вложить свои запросы, это имеет больше смысла, если вы пишете свое утверждение в псевдокоде с несколькими скобками, то, что вы на самом деле пытаетесь сделать, это:

CreatedBy=='anil' AND (make~='*focus*' OR mode~='*focus*')

Что вам нужно сделать в своем коде, так это добавить дополнительный шаг для вложения 2 СЛЕДУЮЩИХ запросов в запрос MUST.

Например:

objBool.Add(query3, BooleanClause.Occur.MUST);
objBool.Add(query4, BooleanClause.Occur.SHOULD);
objBool.Add(query5, BooleanClause.Occur.SHOULD);

станет:

objBool.Add(query3, BooleanClause.Occur.MUST);

BooleanQuery nested = new BooleanQuery();
nested.Add(query4, BooleanClause.Occur.SHOULD);
nested.Add(query5, BooleanClause.Occur.SHOULD);

objBool.Add(nested, BooleanClause.Occur.MUST);

Еще одна вещь, которую следует учитывать, это то, что Lucene не является базой данных, вполне допустимо создать столбец с именем MakeModel, когда вы индексируете контент, который содержит как марку, так и модель, это затем сделает для более простых и быстрых запросов. , С Lucene построение вашего индекса так же важно, если не более важно, чем построение запроса.

0 голосов
/ 23 июня 2011

queryParser.Parse ("+ Модель: focus + CreatedBy: anil")

...