2

Elasticsearch の結果に重みを付けようとしています。

現在、公開されたアイテムのみを取得するために、「アクティブな」ブール値のみをフィルタリングしています。

    query: {
      filtered: {
        query: {
          match: {
            _all: params[:q]
          }
        },
        filter: {
          term: {
            active: true
          }
        }
      },
    }

私は今、私のモデルのいくつかに重みを加えたいと思っています。たとえば、市場は +2 ブーストを取得する必要があります。私はこのようなことを試みていました:(search_typeは私の結果のフィールドで、基本的にはRailsのモデル名です)

POST _search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "_all": "hospitality"
        }
      },
      "functions": [
          {
            "filter": {
            "term": {
              "active": true
            }
          }
          },
          {
            "filter": {
                "term": {
                    "search_type": "Market"   
                }
            },
            "weight": 2
          }
      ]
    }
  }
}

ただし、それは機能していないようです:「関数リストの 1 つのエントリに関数がありません」。だから私"weight": 1はアクティブなフィルターに追加しました..しかし、今では解析できないと言われています。

私は ElasticSearch の経験がなく、ドキュメントはかなり混乱しています。私も何かを使ってみましたcustom_filters_scoreが、私のバージョンの ES ではうまくいかないようです (ここで説明されているように: http://jontai.me/blog/2013/01/advanced-scoring-in-elasticsearch/ )。私が試した別のオプションは、ブールクエリとmustおよびshouldを組み合わせることでしたが、結果はゼロでした...

続行方法がわからない。いくつかの洞察は素晴らしいでしょう。

4

1 に答える 1

2

これを達成するには、フィルターされたクエリを function-score と一緒に使用できるはずです

例:

{
   "query": {
      "filtered": {
         "query": {
            "function_score": {
               "query": {
                  "match": {
                     "_all": "hospitality"
                  }
               },
               "functions": [
                  {
                     "filter": {
                        "term": {
                           "search_type": "Market"
                        }
                     },
                     "weight": 2
                  }
               ]
            }
         },
         "filter": {
            "term": {
               "active": true
            }
         }
      }
   }
}
于 2015-09-10T18:42:59.613 に答える