NameプロパティとSurnameプロパティを持つUserオブジェクトがあります。 1つのクエリを使用してこれらのフィールドを検索したいのですが、multi_match
はドキュメントにありますが、ワイルドカードで適切に使用する方法がわかりません。出来ますか?
multi_match
クエリが動作しませんでした:
{
"query": {
"multi_match": {
"query": "*mar*",
"fields": [
"user.name",
"user.surname"
]
}
}
}
または、query_string
クエリとワイルドカードを使用できます。
"query": {
"query_string": {
"query": "*mar*",
"fields": ["user.name", "user.surname"]
}
}
これは、インデックス時にnGramフィルターを使用するよりも遅くなります(他の回答を参照)が、迅速で汚れたソリューションを探している場合は...
また、マッピングについてはわかりませんが、name
の代わりにuser.name
を使用している場合、マッピングは次のようにする必要があります。
"your_type_name_here": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"surname": {
"type": "string"
}
}
}
}
}
このようなクエリは私のために働いた:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
{"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
]
}
}
}
}
}
あなたがやっていることと似ていますが、私の場合はフィールドごとに異なるマスクがあるかもしれません。
私は今これをやった:
GET _search {
"query": {
"bool": {
"must": [
{
"range": {
"theDate": {
"gte": "2014-01-01",
"lte": "2014-12-31"
}
}
},
{
"match" : {
"Country": "USA"
}
}
],
"should": [
{
"wildcard" : { "Id_A" : "0*" }
},
{
"wildcard" : { "Id_B" : "0*" }
}
],"minimum_number_should_match": 1
}
}
}
ワイルドカードは使用しません。うまく拡張できません。クエリ時に多くの検索エンジンを要求しています。 nGramフィルターを使用して、検索時ではなくインデックス時の処理を行うことができます。
name
とsurname
を正しくインデックス付けした後(マッピングを変更し、上記のリンクに例を示します)、ワイルドカードを使用せずにマルチマッチを使用して、期待どおりの結果を得ることができます。
上記の提案に似ていますが、これは簡単で、私にとってはうまくいきました:
{
"query": {
"bool": {
"must":
[
{
"wildcard" : { "processname.keyword" : "*system*" }
},
{
"wildcard" : { "username" : "*admin*" }
},
{
"wildcard" : { "device_name" : "*10*" }
}
]
}
}
}