Оптимизация поискового запроса - PullRequest
0 голосов
/ 30 декабря 2008

Я работаю над веб-приложением, которое использует Lucene.net (версия 2.0.0.4) для поиска в магазине. Хотя пользователь моего веб-приложения может искать магазины в США, которые находятся в пределах 50 миль от заданного местоположения. Я использую сторонний API, чтобы найти все города в радиусе. Для города, например, Эдисон, Нью-Джерси, он дает мне около 450 городов в пределах 40 миль (API возвращает хеш-таблицу .Net, содержащую 450 городов). Итерируя по этой хеш-таблице, я использую классы BooleanQuery / Query для создания запроса lucene.

В этом сценарии я считаю, что создание, выполнение и возврат результатов поиска через lucene занимает много времени. Есть ли способ, которым я могу оптимизировать этот код ??

Спасибо!

Ответы [ 3 ]

1 голос
/ 28 января 2009

Когда вы строите свой индекс, сопоставьте города с координатами широты и долготы. В веб-приложении, когда вы выполняете поиск по радиусу, сопоставьте искомый город с координатами и выполните запрос диапазона (вам нужно преобразовать расстояние в любые единицы измерения, в которых находятся ваши координаты).

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

0 голосов
/ 29 января 2009

Ответ KenE - хороший ответ, и вам нужно зайти в Google "lucene пространственный поиск" , чтобы узнать больше об этом подходе.

Есть еще один путь, который вы можете сделать, предполагая, что радиус всегда равен 40 милям: просто измените процесс на обратный.

Есть поле с именем nearyby_city. Для каждого магазина в вашем индексе добавьте список городов, которые находятся в его 40-мильном радиусе. Теперь, когда вы ищете магазин рядом с Эдисоном, штат Нью-Джерси, просто добавьте термин nearby_city:"Edison, NJ" к вашему запросу. Теперь только магазины в пределах 40 миль от этого города будут соответствовать вашему запросу.

0 голосов
/ 31 декабря 2008

Я думаю, что ключ к этому исполнению состоит в том, чтобы подумать о том, как вы храните свои данные, и иметь некоторые метаданные вокруг них.

Что я имею в виду под этим?

Составьте список городов, в которых, например, есть магазин в Нью-Джерси, и отфильтруйте города, которые возвращаются из ваших сторонних API, на основе вашего основного списка. Вы можете обнаружить, что у вас есть только 5 матчей из 450 возвращенных. Точно так же я бы не объединил 450 запросов в один запрос - попробуйте разделить их на более мелкие суммы.

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

Надеюсь, это поможет, Киран

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...