0

私が行っている単純なユーザー検索のために、ElasticSearch API にプロキシしているエンドポイントがあります。

/users?nickname=myUsername&email=myemail@gmail.com&name=John+Smith

これらのパラメーターの詳細は次のとおりです。

  • すべてのパラメータはオプションです
  • ニックネームは、全文検索として検索できます (つまり、'myUser' は 'myUsername' を返します)。
  • 電子メールは完全に一致する必要があります
  • 名前は、各トークンの全文検索として検索できます (つまり、'john' は 'John Smith' を返します)。

ElasticSearch 検索呼び出しでは、パラメーターをまとめて AND として処理する必要があります。

現時点では、各パラメーターのみでクエリを実行できますが、すべてをまとめて実行することはできないため、どこから始めればよいかわかりません。

client.search({
    index: 'users',
    type: 'user',
    body: {
        "query": {
            //NEED TO FILL THIS IN
        }
    }
}).then(function(resp){
    //Do something with search results
});
4

1 に答える 1

6

最初に、この特定のユース ケースのマッピングを作成する必要があります。

curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{
  "mytype": {
    "properties": {
      "email": {
        "type": "string",
        "index": "not_analyzed"
      },
      "nickname": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  }
}'

ここでメールを not_analyzed にすることで、完全一致のみが機能することを確認できます。それが完了したら、クエリを作成する必要があります。複数の条件があるため、bool クエリを使用することをお勧めします。複数のクエリを組み合わせることができ、ブールクエリを使用してそれらを処理する方法

クエリ -

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "qbox"
          }
        },
        {
          "prefix": {
            "nickname": "qbo"
          }
        },
        {
          "match": {
            "email": "me@qbox.io"
          }
        }
      ]
    }
  }
}

プレフィックス query を使用して、トークンが qbo で始まる場合でも一致とみなすことを Elasticsearch に伝えます。

また、プレフィックスクエリは非常に高速ではない可能性があります。その場合、ngram アナライザーを使用できます - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html

于 2015-01-10T18:19:58.747 に答える