0

ElasticSearch で誤った結果を返すロケーション クエリに問題があります。

ビジネス検索エンジンである私たちのシステムでは、すべての検索は、場所とクエリ文字列の 2 つの入力を受け取ります。

q=sushi
location=Greenwich Village, New York, New York

検索で最初にグリニッジ ビレッジの寿司を表示し、次にグリニッジ ビレッジ以外の寿司を表示して、寿司以外の結果を表示しないようにします。

問題は、このlocationクエリのせいで、グリニッジ ヴィレッジ内のすべてのもの (弁護士、医師など) が一致することです。ElasticSearch に次のように伝えたいと思います。

q が一致する場合、場所は必須ではありません (グリニッジ ビレッジ以外の寿司を返すことは問題ありません) が、場所が一致する場合は、q も一致しない限り返さないでください (グリニッジ ビレッジの寿司以外の店舗を返すことは問題ありません)。 .

誰でもこれを行う方法について何か考えがありますか?

4

2 に答える 2

2

「寿司」を検索したいようですが(寿司以外の結果は必要ありません)、場所で結果を並べ替えます(最初にグリニッチビレッジの結果が必要です)。

場所を地理的ポイントとして保存している場合は、距離を使用して結果を並べ替えることができます。

場所が単なるフィールドであり、ビジネスが場所の内側か外側かしかわからない場合は、カスタムフィルタスコアクエリを使用して、目的の場所での結果の関連性を高めることができます。queryパーツには「寿司」の検索が含まれ、パーツfiltersには場所の検索が含まれている必要があります。

于 2012-11-02T19:05:31.227 に答える
0

この投稿とここの情報を取り入れて、次の解決策を考え出しました。

  1. すべての「場所」(近隣、都市など) を中心点で索引付けし、すべてのビジネスの座標も索引付けします。

  2. それらを含むビジネスに関連付けられた場所 ID にインデックスを付けます。

  3. サブ検索を使用して、ロケーション バーに入力されたテキストをプレイス レコードに変換します。

  4. CustomScoreQuery を使用して、次の式ですべての結果のスコアを変更します。この式は、試行錯誤によって導き出されました:
    new_score = old_score / (1 + distance_between_place_centerpoint_and_result)^3

  5. また、'should' ブール値クエリとして、place_ids フィールドに対して 3 の結果のプレイス ID をクエリします。これにより、実際に指定された場所の範囲内にあるすべてのものにフラット ブーストが与えられます。

この戦略の副作用は、場所の中心点に近いお店の方が関連性が高いと見なされることです。私の意見では、これが正しいかどうかは議論の余地があります。しかし、それ以外は非常にうまく機能しています。

この解決策を思いつくのに役立った彼の洞察について、imitov に感謝します。

于 2012-11-15T18:16:58.203 に答える