Повышение производительности поиска на основе местоположения с помощью Lucene - PullRequest
2 голосов
/ 23 июня 2009

Я использую Lucene для портала поиска работы, используя .net. Столкнулся с некоторыми проблемами, связанными с производительностью, в следующем случае использования. Вариант использования: При поиске работы пользователь может выбрать место работы (например, Атланта, Джорджия) и выбрать радиальное расстояние (скажем, 50 миль). Время, необходимое для возврата результатов поиска работы из Lucene, довольно велико.

К вашему сведению, мы поддерживаем базу данных sql server 2005, в которой хранятся данные о городе, штате, долготе и широте США и Канады (в общей сложности около 1 миллиона записей).

Могу ли я в любом случае улучшить производительность этого поиска по месту работы?

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

По сути, у вас есть два типа параметров поиска: текстовый и пространственный. Вероятно, вы можете использовать один тип для фильтрации результатов, полученных от другого. Например, для тех, кто ищет работу разработчика .NET в Атланте, штат Джорджия вы можете сначала получить все задания разработчика .NET и отфильтровать их местоположение, или получить все работы вокруг Атланты и отфильтровать их для разработчиков .NET. Я считаю, что первое должно быть быстрее. Вы также можете сохранять рабочие места непосредственно в Lucene и включать их в поиск. Черновик: Индексация: 1. Когда вы получите новое объявление о поиске, найдите его географическое местоположение с помощью базы данных. 2. Сохраните местоположение как поле Lucene в документе объявления. индексирование: 1. Получить все задания в соответствии с текстовыми соответствиями. 2. Используйте геометрические расчеты для определения расстояния между местом пользователя и местом работы. 3. Фильтруйте задания по расстоянию.

Lucene in Action имеет пример пространственного поиска, похожего по духу. Выпускается второе издание . Также ознакомьтесь с предложениями Суджита Пала для пространственного поиска с помощью Lucene и каркаса Патрика О'Лири . Есть также Локаллуцен и LocalSolr , но я не знаю, насколько они зрелые.

0 голосов
/ 26 июня 2009

В конечном счете вы можете захотеть, чтобы lucene обрабатывал пространственный поиск, индексируя плитки . Но если вы уверены, что запрос lucene идет медленно, а не поиск городов, то начните с индексации штата и города вместе. Очень похоже на индексирование нескольких столбцов в реляционной базе данных: поле 'штат: город' со значениями вроде 'GA: Atlanta'. Тогда пересечение не выполняется во время запроса.

0 голосов
/ 24 июня 2009

мой размер индекса составляет около 4 МБ. Используем следующий код для построения запроса для ближайших городов:

foreach (string city in htNearestCities.Keys)
                {
                    cityStateQuery = new BooleanQuery();
                    queryCity = queryParserCity.Parse("\"" + city + "\"");
                    queryState = queryParserState.Parse("\"" + ((string[])htNearestCities[city])[1] + "\"");
                    cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); 
                    cityStateQuery.Add(queryState, BooleanClause.Occur.MUST);

                    findLocationQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD);
                    }
...