Неверные результаты запроса Nhibernate.Search - PullRequest
0 голосов
/ 27 апреля 2011

Я запрашиваю индекс lucene через nhibernate.search, используя следующий код:

var fts = NHibernate.Search.Search.CreateFullTextSession(this._session);

var luceneQuery = "Search:name~0.7 AND Moderated:true NOT PlaceType:WrongType";

var places = fts.CreateFullTextQuery<Place>(luceneQuery)
            .List<Place>();

Проблема в том, что запрос возвращает все типы Places, включая WrongType.Когда я пытаюсь выполнить тот же запрос к тому же индексу в Luke, все в порядке, места типа WrongType не возвращаются.

Поле поиска представляет собой конкатенацию многих полей в объекте Place.Я использую поля Moderated и PlaceType, чтобы отфильтровать некоторые записи, как я обнаружил, что таким образом сохраняется первоначальный порядок сортировки (по оценке) из запроса Lucene.

Как можно исключить Places по PlaceType из результатовиспользуя NHibernate.Search?

1 Ответ

0 голосов
/ 28 апреля 2011

Хорошо, значит, я нашел решение.

Я проиндексировал все поля с помощью WhiteSpaceAnalyzer.Кажется, что NHibernate.Search использует StandardAnalyzer по умолчанию, независимо от того, что я установил глобальный AnalyzerClass в WhiteSpaceAnalyzer.После разбора запроса это выглядело так:

"+Search:name~0.7 +Moderated:true -PlaceType:wrongtype"

, который не работал, потому что значения в поле PlaceType не были в нижнем регистре.

Изменение кода в вопросе на что-то вроде этого:

var fts = NHibernate.Search.Search.CreateFullTextSession(this._session);

var queryParser = new QueryParser("text", new WhitespaceAnalyzer());
var luceneQuery = "Search:name~0.7 AND Moderated:true NOT PlaceType:WrongType";
var query = queryParser.Parse(luceneQuery);

var places = fts.CreateFullTextQuery(query, typeof(Place))
            .List<Place>();

разрешил ситуацию.

...