我有一个User对象,其属性为Name和Surname。我想使用一个查询搜索这些字段,我在文档中找到multi_match
,但我不知道如何正确使用它与通配符。可能吗?
我尝试使用multi_match
查询,但它不起作用:
{
"query": {
"multi_match": {
"query": "*mar*",
"fields": [
"user.name",
"user.surname"
]
}
}
}
答案 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.
正确索引name
和surname
后(更改您的映射,上面的链接中有一些示例)您可以使用多匹配但没有通配符并获得预期结果。
答案 4 :(得分:1)
类似于上面的建议,但这很简单并且对我有用:
{
"query": {
"bool": {
"must":
[
{
"wildcard" : { "processname.keyword" : "*system*" }
},
{
"wildcard" : { "username" : "*admin*" }
},
{
"wildcard" : { "device_name" : "*10*" }
}
]
}
}
}