6

私は現在、Elasticsearch を広告 Web サイトの検索エンジンとして使用することを選択したプロジェクトに取り組んでいます。

現在、次のビジネスルールがあります。

1 ページあたり 25 の広告を表示します。この 25 個の広告のうち、表示される広告のうち 10 個は「有料広告」であり、残りの 15 個は「無料」である必要があります。25 個すべてが実行された検索に関連している必要があります (つまり、キーワード、地域、価格、カテゴリなど)。

2 つの別々のクエリを使用してこれを実行できることはわかっていますが、これはリソースの膨大な浪費のようです。「サブクエリ」を実行して(それを呼び出すことができる場合)、これらの結果を単一の結果セットに結合することは可能ですか? 1 つのクエリで、elasticsearch から 10 個の「有料」広告と 15 個の「無料」広告のみを取得する方法はありますか? もちろん、この要件を可能にするのに十分な広告があると仮定します。

助けてくれてありがとう!

編集- より明確にするためにマッピング情報を追加するだけです。

"properties": {
       "advertText": {
          "type": "string",
          "boost": 2,
          "store": true,
          "analyzer": "snowball"
       },
       "canonical": {
          "type": "string",
          "store": true
       },
       "category": {
          "properties": {
             "id": {
                "type": "string",
                "store": true
             },
             "name": {
                "type": "string",
                "store": true
             },
             "parentCategory": {
                "type": "string",
                "store": true
             }
          }
       },
       "contactNumber": {
          "type": "string",
          "index": "not_analyzed",
          "store": true
       },
       "emailAddress": {
          "type": "string",
          "store": true,
          "analyzer": "url_email_analyzer"
       },
       "advertType": {
          "type": "string",
          "index": "not_analyzed"
       },
       ...
}

私が望むのは、これをクエリして、「advertType」が「有料」である 10 個の結果と、「advertType」が「無料」ある 15 個の結果を取得できるようにすることです...

4

3 に答える 3

7

あなたが取ることができるいくつかのアプローチ。

まず、マルチ検索 API を使用してみてください。

マルチ検索 API

マルチ検索 API を使用すると、同じ API 内で複数の検索リクエストを実行できます。そのエンドポイントは _msearch です。

リクエストの形式は、バルク API の形式に似ています。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-multi-search.html

基本的な例:

curl -XGET 'http://127.0.0.1:9200/advertising_index/_msearch?pretty=1'  -d '
{}
{"query" : {"match" : {"Paid_Ads" : "search terms"}}, "size" : 10}
{}
{"query" : {"match" : {"Free" : "search terms"}}, "size" : 15}
'

フィールドとクエリを作成しましたが、全体的なアイデアは理解できるはずです。_msearch エンドポイントにアクセスし、空の括弧で始まる一連のクエリを渡します{}。有料の場合はサイズを 10 に設定し、無料の場合はサイズを 15 に設定しました。

独自の実装の詳細に従って、このようなものを使用できるはずです。

何らかの理由でそれが機能しない場合は、制限フィルターを使用することもできます。

制限フィルター

制限フィルターは、実行するドキュメントの数 (シャードごと) を制限します。例えば:

{
    "filtered" : {
        "filter" : {
             "limit" : {"value" : 100}
         },
         "query" : {
            "term" : { "name.first" : "shay" }
        }
    }
}

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-limit-filter.html

制限はインデックスごとではなく、シャードごとであることに注意してください。インデックスあたり 5 つのプライマリ シャードのデフォルトを指定すると、合計 10 の応答を取得するには、制限を 2 (2X5 == 10) に設定します。また、あるシャードに複数の一致があり、別のシャードに一致がない場合、不完全な結果が生成される可能性があることに注意してください。

次に、2 つのフィルターを boolean フィルターと組み合わせます。

ブールフィルター

他のクエリのブール値の組み合わせに一致するドキュメントに一致するフィルター。句が他のフィルターであることを除いて、概念はブール クエリに似ています。フィルターを受け入れるクエリ内に配置できます。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html

特定のインデックス、マッピング、データ、およびクエリに関するより多くの情報が必要になるため、これについて詳しく説明することはしません。

于 2014-06-25T20:12:56.057 に答える