Lucene を使用して Web ベースの求人検索アプリケーションに取り組んでいます。私のサイトのユーザーは、「マサチューセッツ州ボストン」またはその他の場所から半径 100 マイル以内の求人を検索できます。また、「関連性」(つまり、lucene によって返されるスコア) で並べ替えられた検索結果を降順に表示する必要があります。
サードパーティ API を使用して、指定された都市の半径内にあるすべての都市を取得しています。この API は、「マサチューセッツ州ボストン」から半径 100 マイル以内にある約 864 の都市を返します。
「BuildNearestCitiesQuery」メソッドの一部である次のロジックを使用して、都市/州の Lucene クエリを作成しています。ここで NearestCities は上記の API によって返されたハッシュテーブルです。CityName as キーと StateCode を値として持つ 864 の都市が含まれています。また、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 の Search メソッドに入力して、半径 100 マイル以内のすべての求人を取得します。
searcher.Search(finalQuery, collector);
この BuildNearestCitiesQuery メソッドの実行には、平均でなんと 29 秒もかかることがわかりました。これは、Web サイトの標準では明らかに受け入れられません。ステートメント。
特定の場所の求人は動的な属性であり、都市には今日 2 つの求人 (特定の検索基準を満たす) がある可能性がありますが、3 日後には同じ検索基準の求人はありません。そのため、「キャッシュ」は使用できません。こっち。
このロジックを最適化する方法はありますか?それとも、Lucene を使用して 100 マイル以内にあるすべてのジョブを見つけるためのアプローチ/アルゴリズム全体を最適化する方法はありますか?
参考までに、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));
読んでくれて本当にありがとう!
ジャニス