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

Mar*_*ica 45 wildcard elasticsearch

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

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

{
    "query": {
        "multi_match": {
            "query": "*mar*",
            "fields": [
                "user.name",
                "user.surname"
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ram*_*laf 72

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

"query": {
    "query_string": {
        "query": "*mar*",
        "fields": ["user.name", "user.surname"]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我不确定您的映射,但如果您使用user.name而不是name您的映射需要看起来像这样:

"your_type_name_here": {
    "properties": {
        "user": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "surname": {
                    "type": "string"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 答案是没有回答如何使用multi_match和wildcard的问题.有人有想法吗? (3认同)

小智 17

这样的查询对我有用:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "should": [
            {"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
            {"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 10

我现在就这样做了:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


ram*_*laf 7

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

请参阅有关nGram过滤器的讨论。

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

  • 缺点:索引大小将增长很多。 (3认同)

小智 6

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

{
"query": {
    "bool": {
        "must":
        [
            {
                "wildcard" : { "processname.keyword" : "*system*" }
            },
            {
                "wildcard" : { "username" : "*admin*" }
            },
            {
                "wildcard" : { "device_name" : "*10*" }
            }
        ]
    }
}
}
Run Code Online (Sandbox Code Playgroud)