3

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));

読んでくれて本当にありがとう!

ジャニス

4

6 に答える 6

0

未使用であり、状態を取得するための不要なマップルックアップを除けば、tempFinalQuery投稿するコードにはそれほどひどいものはないようです。フォーマットは別として...

メソッドにすべての時間がかかる場合は、Parseここにコードを投稿するのが理にかなっています。

于 2009-01-02T13:58:50.437 に答える
0

あなたの質問のポイントを見逃したかもしれませんが、郵便番号の緯度と経度を保存する可能性はありますか?それがオプションである場合は、2つの座標間の距離を計算して、はるかに簡単なスコアリングメトリックを提供できます。

于 2009-06-10T19:38:35.840 に答える
0

最善のアプローチは、最も近い都市の決定を検索フィルターに移動することだと思います。また、フィールドの設定方法についても再検討します。クエリを簡素化するために、city+stateを持つ1つの用語を作成することを検討してください。

于 2009-06-13T04:26:21.380 に答える
0

これはあまりにもにおいがするという他の人に同意します. また、都市名のテキスト検索は必ずしも信頼できるとは限りません。多くの場合、地名の間には多少の主観性があります (特に、それ自体が大きい都市内のエリア)。

地理空間クエリを実行するのが方法です。セットアップの残りの部分がわからない場合、アドバイスするのは困難です。たとえば、Fluent to NHibernate や SQL Server 2008 に空間サポートが組み込まれています。その後、非常に迅速かつ効率的に検索を行うことができます。ただし、課題はこれを Lucene 内で機能させることです。

SQL Server の空間サポートを使用して「最初のパス」クエリを実行し、その結果を Lucene で実行できますか?

空間クエリを実行することのもう 1 つの主な利点は、結果を距離で簡単に並べ替えることができることです。これは顧客にとってメリットとなります。

于 2009-11-06T13:22:51.267 に答える
0

私はお勧めします:

  • 入ってくる場所の緯度と経度を保存する
  • ユーザーが都市と距離を入力すると、それを緯度/経度の値と度に変換します
  • 数値距離の緯度/経度の比較に基づいて、単一の単純なルックアップを実行します

これがどのように機能するかの例は、Geo::Distance Perl モジュールで見ることができます。簡単な SQL を介してこのルックアップを実装するsourceclosestのメソッドを見てください。

于 2009-06-26T18:21:31.417 に答える