19

指定された 2 つのフィールドに対して簡単なクエリを実行しようとしていますが、マニュアルと Google はほとんど役に立たないことが証明されています。以下の例は、私が何をしたいのかを明確にするはずです。

{
  "query": {
      "and": {
        "term": {
          "name.family_name": "daniel",
          "name.given_name": "tyrone"
        }
      }
   }
}

おまけの質問として、「Daniel Tyrone」が「daniel」で検索されるのに、「Daniel」を検索すると検索されないのはなぜですか。大文字と小文字を区別しない非常に奇妙な検索のように動作します。

4

4 に答える 4

15

編集:更新、申し訳ありません。TermBoolクエリ内で、フィールドごとに個別のオブジェクトが必要です。

{
  "query": {
    "bool": {
        "must" : [
          {
           "term": {
             "name.family_name": "daniel"
           }
         },
         {
           "term": {
             "name.given_name": "tyrone"
           }
         }
       ]
     }
   }
}

用語クエリはElasticSearchによって分析されないため、大文字と小文字が区別されます。用語クエリは、ESに「大文字と小文字や句読点を含め、インデックス内でこの正確なトークンを探す」と言います。

大文字と小文字を区別しないようにする場合は、アナライザーにキーワード+小文字のフィルターを追加できます。または、クエリ時にテキストを分析するクエリを使用することもできます(Matchクエリのように)

Edit2:AndまたはBoolフィルターも使用できます。

于 2013-03-18T12:40:11.263 に答える
6

同じフィールドで少なくとも複数のテキストを比較するための解決策を見つけました。

{
  "query": {
    "match": {
      "name.given_name": {
        "query": "daniel tyrone",
        "operator": "and"
      }
    }
  }

そして、私はこれを複数のフィールドで見つけました、これは正しい方法ですか?

{
  "query": {
    "bool": {
      "must": [        
        {
          "match": {
            "name.formatted": {
              "query": "daniel tyrone",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "display_name": "tyrone"
          }
        }
      ]
    }
  }
}
于 2013-03-18T13:15:45.250 に答える
0

PHPでjsonを作成する場合、これらの2つの例がうまくいきました。

$activeFilters は、'attractions, limpopo' のようなカンマ区切りの文字列です。

$articles = Article::searchByQuery(array(
        'match' => array(
            'cf_categories' => array(
                'query' => $activeFilters,
                'operator' =>'and'
            )
        )
    ));

    // The below code is also working 100%
    // Using Query String https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-query-filter.html
    // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
    /* $articles = Article::searchByQuery(array(
        'query_string' => array(
            'query' => 'cf_categories:attractions AND cf_categories:limpopo'
        )
    )); */
于 2015-11-24T22:58:47.423 に答える
0

これは私にとってはうまくいきました:クエリのパラメータの数が であるため、 にminimum_should_match設定されています。2AND2

{
"query": {
    "bool": {
        "should": [
                {"term": { "name.family_name": "daniel"}},
                {"term": { "name.given_name": "tyrone" }}
            ],
    "minimum_should_match" : 2

        }
    }
}
于 2021-04-01T04:09:54.103 に答える