web-dev-qa-db-ja.com

Elasticsearchでのワイルドカードを使用したmulti_matchの使用方法

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"
                }
            }
        }
    }
}
71
ramseykhalaf

このようなクエリは私のために働いた:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "should": [
            {"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
            {"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
          ]
        }
      }
    }
  }
}

あなたがやっていることと似ていますが、私の場合はフィールドごとに異なるマスクがあるかもしれません。

17

私は今これをやった:

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
        }
    }
}
9
David Johnson

ワイルドカードは使用しません。うまく拡張できません。クエリ時に多くの検索エンジンを要求しています。 nGramフィルターを使用して、検索時ではなくインデックス時の処理を行うことができます。

nGramフィルターに関するこの説明を参照してください。

namesurnameを正しくインデックス付けした後(マッピングを変更し、上記のリンクに例を示します)、ワイルドカードを使用せずにマルチマッチを使用して、期待どおりの結果を得ることができます。

7
ramseykhalaf

上記の提案に似ていますが、これは簡単で、私にとってはうまくいきました:

{
"query": {
    "bool": {
        "must":
        [
            {
                "wildcard" : { "processname.keyword" : "*system*" }
            },
            {
                "wildcard" : { "username" : "*admin*" }
            },
            {
                "wildcard" : { "device_name" : "*10*" }
            }
        ]
    }
}
}
1
JFletcher