我有一个Elasticsearch设置,允许用户将索引搜索为外卡。
array:3 [
"index" => "users"
"type" => "user"
"body" => array:4 [
"from" => 0
"size" => 25
"sort" => array:1 [
1 => array:1 [
"order" => "asc"
]
]
"query" => array:1 [
"bool" => array:1 [
"should" => array:1 [
0 => array:1 [
0 => array:1 [
"wildcard" => array:1 [
"full_name" => "john doe"
]
]
]
]
]
]
]
]
当我将此数组传递给搜索函数时,它返回一个空数组。但是有一个与“John Doe”相关的文档,当我运行"full_name" => "john"
时,搜索会返回该文档。
我觉得问题在于空间。
{
"users": {
"user": {
"properties": {
"address": {
"type": "string"
},
"full_name": {
"type": "string"
},
"industry_name": {
"type": "string"
}
}
}
} }
答案 0 :(得分:2)
假设通过elasticsearch分析字段full_name
。
您的案例中的问题是wildcard query无法分析搜索字符串
匹配具有与通配符表达式匹配的字段的文档(不是 分析的)。
在你的情况下,它表示,elasticsearch在倒排索引中存储了john
和doe
令牌,但是通配符查询正在搜索john doe
令牌,并且它失败。
你可以做些什么:
full_name
字段。
注意:您必须搜索John Doe
才能获得匹配,因为
价值未经过分析,因此john doe
无法匹配。只需离开full_name
即可改善第一个解决方案
分析,但使用自定义分析器(通配符,小写)。它会
允许您搜索文字john doe
或John Doe
。
{
"settings" : {
"index" : {
"analysis" : {
"analyzer" : {
"lowercase_analyzer" : {
"tokenizer" : "keyword",
"filter" : [
"lowercase"
],
"type" : "custom"
}
}
}
}
},
"mappings" : {
"user" : {
"properties" : {
"id" : {
"type" : "integer"
},
"fullName" : {
"analyzer" : "lowercase_analyzer",
"type" : "string"
}
}
}
}
}
您可以利用multi field,并搜索原始广告 字段。
"full_name.raw" => "John Doe"
希望它能帮助您处理用例。
更新
Here您可以找到有关如何控制索引映射的更多信息。
答案 1 :(得分:0)
我认为默认情况下会应用标准tokenizer。
在这种情况下,它会将文本john doe视为短语。
所以尝试短语搜索
"full_name" => "\"john doe\""
答案 2 :(得分:0)
如果您想考虑空格,可以执行以下操作:
{
"match" : {
"full_name" : {
"query" : "john doe",
"operator" : "and",
"zero_terms_query": "all"
}
}
}
检查一下:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html