ユーザーからの自由形式のクエリが与えられた場合、場所のフレーズが含まれているかどうかを判断しようとしています。
例: フリーフォーム クエリ「カリフォルニア州サンフランシスコのニューヨーク スタイル ピザ」と、「デンバー コ」、「マイアミ フロリダ」、「ニューヨーク シティ ニューヨーク」、「サンフランシスコ カリフォルニア」などの場所のフレーズを含むドキュメントのインデックスが与えられた場合、「paris france」などの場合、一致はロケーション フレーズ「san francisco ca」を含むドキュメントになります。
ロケーション フレーズを含むインデックスには、別のドキュメントに許容される順列も含まれます。上記の例では、"san francisco ca"、"san francisco california"、および場合によっては "sf ca"、"bay area ca" など、すべてインデックス内の個別のドキュメントとして含めることができます。大文字と小文字の区別と句読点は前もって破棄されるため、「カリフォルニア州サンフランシスコのニューヨーク スタイルのピザ」というクエリは「カリフォルニア州サンフランシスコのニューヨーク スタイルのピザ」になります。
また、「都市」と「州」と「国」をさまざまなフィールドに含めるなど、特定のタイプのクエリでこれを機能させるために場所にインデックスを付けるためのより良い方法または必要な方法がある場合は、私が行うことができますそれもまた、私は提案を非常に受け入れています。
私がこれまでに試したこと:
- プレーンな古い一致クエリ。最適に動作するように見えますが、順序付けは無視されます...「san francisco ca」は一致しますが、「ca francisco san」は一致しないはずです。位置も無視します。
- フレーズ一致。入力クエリに余分な用語 (「ニューヨーク スタイルのピザ」) が含まれているため、一致するものが得られないため、まったく機能しません。
- マルチフィールドマッチ、cross_fields オプション。一致クエリと同じ問題。順序と位置を無視します。これは、"city" と "state" などが異なるフィールドであるインデックスのバージョンで試みられました。
- 浸透。まったく仕事に就けませんでした。呼び出し GET .../_percolate は、インデックス内のすべてのドキュメントを取得します。また、.percolator タイプのビルドは非常に遅く、バルク API を使用してインスタンスをクラッシュさせました (JVM メモリ 99%)。私のデータベースには約 100 万の場所があり、約 120K の場所で一貫してクラッシュする percolator には多すぎると思います。私が読んだことから、これはパーコレーターの適切な使用例ではないと思いますが、よくわかりません。
私が試していないこととその理由:
- 帯状疱疹。特定の場所に含まれる用語の数は可変であり (つまり、「ダラス テキサス」、「サンフランシスコ カリフォルニア」、「ニューヨーク市、ニューヨーク」など)、帯状疱疹は特定の数の用語で機能するようです。
- クエリ文字列。ユーザーがフレーズを二重引用符で囲む必要はありません。また、クエリ言語 (OR、AND など) も必要ありません。また、位置を無視します。
私はこの問題を解決するのに 3 ~ 4 日を費やしました。サンプルのクエリ/インデックス/マッピングは素晴らしいですが、使用する必要があるクエリの種類 (およびインデックス作成とマッピング) を教えてくれるだけでも非常に役立つので、少なくとも「適切なツリーを作成する」ことができます!
他のツールがオープンソースであり、自由に利用でき、適切にサポートされ、使用されている限り、ES と組み合わせて他のツールを使用することにオープンです。位置データベースには最大 100 万件のレコードが含まれています。
おまけ: ロケーション フレーズがある場合は、クエリの最後にあると想定しています。それを感知するか、それに応じて結果を後押しする何らかの方法は素晴らしいでしょう. これを絶対的な要件にしたくないことに注意してください。ユーザーが「ニューヨーク スタイルのピザを提供しているサンフランシスコ カリフォルニア州のピザ店が欲しい」というクエリを送信した場合、前述のインデックスが指定された唯一の有効なロケーション フレーズは「サンフランシスコ カリフォルニア州」であり、一致するはずです。
ボーナス 2X: 各場所の人口情報があります。人口が多い場合に結果をわずかにブーストする方法も素晴らしいでしょう (field_value_factor 関数と ln1p 修飾子を使用して function_score を試してみましたが、うまく機能しているように見えますが、パーコレーターを使用した場合にどのように機能するかはわかりません)。
BONUS 3X!: 「san francsco」などのわずかなタイプミスに対応できるとよいでしょう。
ElasticSearch 1.3.2 を使用しています。
ありがとうございました!!
編集:明確にするために、ここでうまく説明されているように、インデックス付きのフレーズがクエリよりも短い場合、フレーズ検索を探していますが、残念ながら完全には解決されていません: