2009-06-23 3 views
2

Я использую Lucene для поиска работы с использованием .net. Перед лицом проблем, связанных с производительностью, в следующем примере использования. Использование: При поиске работы пользователь может выбрать место работы (для exameple: Atlanta, GA) и выбрать радиальное расстояние (скажем, 50 миль). Время, необходимое для возврата результатов поиска работы из Lucene, довольно велико.Улучшение производительности поиска по местоположению с использованием Lucene

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

В любом случае я могу улучшить работу этого поиска на основе местоположения на основе поиска?

+0

Не могли бы вы рассказать о том, как именно вы используете Lucene для поиска по местоположению в зависимости от вашей базы данных? Например, когда пользователь ищет «Атланту, штат Джорджия», как Луцен знает, в каких городах они находятся в радиусе 50 миль от него? Нужно ли сначала запрашивать базу данных? –

+0

Спасибо за комментарии ur. У нас есть API-интерфейс расстояния на основе .Net, который принимает местоположение в качестве входных данных и возвращает ближайшие города в пределах заданного радиуса. Затем эта коллекция предоставляется Lucene для поиска заданий. – user74042

+0

Итак, вы ищете индекс Lucene для строки «Atlanta, GA»? Что вы индексируете? Вы индексируете «Атланту, штат Джорджия» в качестве одного термина или делится на токены? – Gandalf

ответ

3

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

Lucene in Action имеет пример пространственного поиска, аналогичный по духу. A second edition находится в разработке. Кроме того, проверьте Sujit Pal's suggestions for spatial search with Lucene и Patrick O'Leary's framework. Есть также Locallucene и LocalSolr, но я не знаю, насколько они зрелые.

0

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

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); 
        } 
+0

4MB? Lucene немного переборщила за такой небольшой набор данных. – Gandalf

+0

мы ожидаем, что миллионы записей будут проиндексированы в Lucene по линии ... – user74042

0

Вы можете в конечном счете, хотят иметь Lucene обрабатывать пространственный поиск по индексации tiles. Но если вы уверены, что запрос lucene медленный, а не поиск городов, начните с индексации состояния и города вместе. Подобно индексированию нескольких столбцов в реляционной базе данных: поле «state: city» со значениями, такими как «GA: Atlanta». Тогда пересечение не выполняется во время запроса.

 Смежные вопросы

  • Нет связанных вопросов^_^