我有一个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"
}
}
}
}
}
最佳答案
假设字段full_name
通过elasticsearch分析。
您遇到的问题是wildcard query无法分析搜索字符串的事实
在您的情况下,这意味着Elasticsearch在反向索引中存储了john
和doe
token ,但是通配符查询正在搜索john doe
token ,但失败。
您可以对此做些什么:
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"
}
}
}
}
}
Realm 。
"full_name.raw" => "John Doe"
希望它可以帮助您处理用例。
更新
Here您可以找到更多有关如何控制索引映射的信息。
关于php - Elasticsearch 空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31002772/