2

FOQElasticaBundleを使用したクエリ構築に問題があります

私は3つのエンティティを持っています

  • ユーザー
  • ホテル
  • 雰囲気

ユーザーは1つ以上のホテルを持つことができ、各ホテルには1つの雰囲気しかありません。私の設定ファイルには、次のものがあります。

foq_elastica:
clients:
    default: { host: %elasticsearch.host%, port: %elasticsearch.port% }
indexes:
    MyBundle:
        client: default
        finder:
        types:
            user:
                mappings:
                    id:
                        boost: 10
                        analyzer: fr_case_analyzer
                    name:
                        boost: 5
                        analyzer: fr_case_analyzer
                    hotels:
                        type: "nested"
                        properties:
                            name:
                                boost: 10
                                analyzer: fr_case_analyzer
                            ambiance:
                                boost: 1

ユーザーの名前またはホテルの名前を入力してユーザーを検索できるようにし、場合によってはAmbianceタイプにフィルターを追加できるようにします。したがって、クエリは次のようになります。

$mainQuery = new \Elastica_Query_Bool();
$nameQuery = new \Elastica_Query_Bool();
$filtersQuery = new \Elastica_Query_Bool();


//searching in Users' names
$nameQuery = new \Elastica_Query_Text();
$nameQuery->setFieldQuery('name', $searchName);
$nameQuery->setFieldParam('name', 'boost', 5);
$nameQuery->setFieldParam('name', 'type', 'phrase_prefix');

//searching in Hotels' names
$hotelNameQuery = new \Elastica_Query_Text();
$hotelNameQuery->setFieldQuery('name', $searchName);
$hotelNameQuery->setFieldParam('name', 'boost', 3);
$hotelNameQuery->setFieldParam('name', 'type', 'phrase_prefix');

$nestedHotelNameQuery = new \Elastica_Query_Nested();
$nestedHotelNameQuery->setPath('hotels');
$nestedHotelNameQuery->setQuery($hotelNameQuery);

$nameQuery->addShould($nameQuery);
$nameQuery->addShould($nestedHotelNameQuery);

//if filter on ambiance
$ambianceQuery = new \Elastica_Query_Term();
$ambianceQuery->setTerm('ambiance', $arrFilters['ambiance']);

$nestedAmbianceQuery = new \Elastica_Query_Nested();
$nestedAmbianceQuery->setPath('hotels');
$nestedAmbianceQuery->setQuery($ambianceQuery);

$filtersQuery->addMust($nestedAmbianceQuery);

//adding the parameters to the main query
$mainQuery->addMust($nameQuery);
$mainQuery->addMust($filtersQuery);

残念ながら、これは機能せず、Ambianceフィルターがアクティブになっている場合は結果を返しませんが、名前だけで検索すると完全に機能します。

私は何を間違えますか?

4

3 に答える 3

0

これが私自身のバージョンのソリューションです:

Elasticsearch のドキュメントによると、次の json に似た構造を実装する必要があります。

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "eggs" }}, 
        {
          "nested": {
            "path": "comments", 
            "query": {
              "bool": {
                "must": [ 
                  { "match": { "comments.name": "john" }},
                  { "match": { "comments.age":  28     }}
                ]
        }}}}
      ]
}}}

symfony 2 でこれを行うには、FOSElasticaBundle バンドルに従って、次のコード行を作成します。

//if filter on ambiance
$ambianceQuery = new \Elastica_Query_Term();
$ambianceQuery->setTerm('ambiance', $arrFilters['ambiance']);
// We will add the the term to the query bool 
$filtersQuery->addMust($ambianceQuery)

$nestedAmbianceQuery = new \Elastica_Query_Nested();
$nestedAmbianceQuery->setPath('hotels');
// we will set the result as argument in the setQuery method.
$nestedAmbianceQuery->setQuery($filtersQuery);


// And finally we add the nested query to the main query bool through addMust. 
$mainQuery->addMust($nestedAmbianceQuery);

それが他の人を助けることを願っています。

A+

于 2016-02-22T10:51:14.813 に答える
-1

同じ問題がありました。これは私のために働く:

..
$ambianceQuery->setTerm('hotels.ambiance', $arrFilters['ambiance']);
..

Symfony2 の FOQElasticaBundle (現在は FOSElasticaBundle) でこれに関する例は見つかりませんでしたが、次のような Elasticsearch クエリで終了する必要があります。

http://www.elasticsearch.org/guide/reference/query-dsl/nested-query/

次のような生のelasticsearchクエリを実行/テストできます。

$queryString = '{..JSON..}';
$boolQuery = new \Elastica_Query_Builder($queryString);
于 2013-04-04T06:57:56.830 に答える