Я работаю над приложением поиска работы через Интернет, используя Lucene. Пользователь на моем сайте может искать вакансии, которые находятся в радиусе 100 миль от «Бостона, Массачусетса» или любого другого места.
Кроме того, мне нужно показать результаты поиска, отсортированные по «релевантности» (т. Е. Оценка, возвращаемая lucene) в порядке убывания.
Я использую сторонний API для извлечения всех городов в пределах заданного радиуса города. Этот API возвращает мне около 864 городов в радиусе 100 миль от «Бостона, Массачусетс».
Я создаю запрос Lucene для города / штата, используя следующую логику, которая является частью моего метода "BuildNearestCitiesQuery".
Здесь nearCities - это хеш-таблица, возвращенная вышеуказанным API. Он содержит 864 города с ключом задницы CityName и StateCode в качестве значения.
И finalQuery - это объект Lucene BooleanQuery, который содержит другие критерии поиска, введенные пользователем, такие как: навыки, ключевые слова и т. Д.
foreach (string city in nearestCities.Keys)
{
BooleanQuery tempFinalQuery = finalQuery;
cityStateQuery = new BooleanQuery();
queryCity = queryParserCity.Parse(city);
queryState = queryParserState.Parse(((string[])nearestCities[city])[1]);
cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); //must is like an AND
cityStateQuery.Add(queryState, BooleanClause.Occur.MUST);
}
nearestCityQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD); //should is like an OR
finalQuery.Add(nearestCityQuery, BooleanClause.Occur.MUST);
Затем я ввожу объект finalQuery в метод поиска Lucene, чтобы получить все задания в радиусе 100 миль.
searcher.Search(finalQuery, collector);
Я обнаружил, что этот метод BuildNearestCitiesQuery выполняется в среднем 29 секунд, что явно неприемлемо для любых стандартов веб-сайта. Я также обнаружил, что для выполнения операторов, использующих "Parse", требуется значительное количество времени. по сравнению с другими высказываниями.
Работа для заданного местоположения является динамическим атрибутом в том смысле, что в городе сегодня может быть 2 вакансии (удовлетворяющих определенным критериям поиска), но ноль вакансий по тем же критериям поиска через 3 дня. Поэтому я не могу использовать любую "Кеширование" здесь.
Можно ли как-нибудь оптимизировать эту логику? Или в этом отношении весь мой подход / алгоритм к поиску всех заданий в пределах 100 миль с помощью Lucene?
К вашему сведению, вот как выглядит моя индексация в Lucene:
doc.Add(new Field("jobId", job.JobID.ToString().Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("title", job.JobTitle.Trim(), Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("description", job.JobDescription.Trim(), Field.Store.NO, Field.Index.TOKENIZED));
doc.Add(new Field("city", job.City.Trim(), Field.Store.YES, Field.Index.TOKENIZED , Field.TermVector.YES));
doc.Add(new Field("state", job.StateCode.Trim(), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.YES));
doc.Add(new Field("citystate", job.City.Trim() + ", " + job.StateCode.Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED , Field.TermVector.YES));
doc.Add(new Field("datePosted", jobPostedDateTime, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("company", job.HiringCoName.Trim(), Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("jobType", job.JobTypeID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED,Field.TermVector.YES));
doc.Add(new Field("sector", job.SectorID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED, Field.TermVector.YES));
doc.Add(new Field("showAllJobs", "yy", Field.Store.NO, Field.Index.UN_TOKENIZED));
Спасибо огромное за чтение! Буду очень признателен за помощь.
Janis