Elasticsearch如何将multi_match与通配符一起使用

时间:2013-06-05 07:19:31

标签: elasticsearch wildcard

我有一个User对象,其属性为Name和Surname。我想使用一个查询搜索这些字段,我在文档中找到multi_match,但我不知道如何正确使用它与通配符。可能吗?

我尝试使用multi_match查询,但它不起作用:

{
    "query": {
        "multi_match": {
            "query": "*mar*",
            "fields": [
                "user.name",
                "user.surname"
            ]
        }
    }
}

5 个答案:

答案 0 :(得分:63)

或者,您可以使用带有通配符的query_string查询。

"query": {
    "query_string": {
        "query": "*mar*",
        "fields": ["user.name", "user.surname"]
    }
}

这比在索引时使用nGram过滤器要慢(参见我的其他答案),但是如果你正在寻找快速而肮脏的解决方案......

此外,我不确定您的映射,但如果您使用的是user.name而不是name,则您的映射需要如下所示:

"your_type_name_here": {
    "properties": {
        "user": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "surname": {
                    "type": "string"
                }
            }
        }
    }
}

答案 1 :(得分:16)

这样的查询对我有用:

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

与你正在做的类似,除了在我的情况下,不同领域可能有不同的面具。

答案 2 :(得分:9)

我现在就这样做了:

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
        }
    }
}

答案 3 :(得分:6)

我不会使用通配符,它​​不会很好地扩展。你在查询时询问了很多搜索引擎。您可以使用nGram过滤器在索引时进行处理而不是搜索时间。

See this discussion on the nGram filter.

正确索引namesurname后(更改您的映射,上面的链接中有一些示例)您可以使用多匹配但没有通配符并获得预期结果。

答案 4 :(得分:1)

类似于上面的建议,但这很简单并且对我有用:

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