Php 空间弹性搜索
我有一个Elasticsearch设置,允许用户以通配符的形式搜索索引Php 空间弹性搜索,php,
elasticsearch,Php,
elasticsearch,我有一个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 [ "bo
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" => "\"john doe\""
如果你想考虑空间,你可以做一些类似的事情:
{
"match" : {
"full_name" : {
"query" : "john doe",
"operator" : "and",
"zero_terms_query": "all"
}
}
}
检查此项:假设字段
全名
由elasticsearch分析
您案例中的问题是,它不分析搜索字符串
匹配字段与通配符表达式匹配的文档(不是
分析)
在您的例子中,这意味着elasticsearch将john
和doe
标记存储在反向索引中,但通配符查询正在搜索john doe
标记,并且失败
对此,您可以做些什么:
全名
字段。
注意:您必须搜索johndoe
以获得匹配项,因为
未分析值,因此john doe
不匹配全名
已分析,但使用自定义分析器(通配符,小写)。会的
允许您搜索文本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"
}
}
}
}
}
您可以找到有关如何控制索引映射的更多信息。您可以共享索引映射吗?您是否尝试了
和运算符?@Rob:我已经添加了索引mapping@DamForums感谢您的更新,但您发布了搜索命中率,而不是索引映射。这就是你可以检索它的方式@Rob:我已经放置了映射。我找到了这个链接,说我应该尝试将索引更改为“未分析”。但我想不出这不是最好的方法,因为你正在使用Lucene regex引擎进行搜索,如果存在一些未替换的字符,这将导致查询抛出异常。@fjcero我只对当前案例做了快速回答:)太好了!我不得不与ES允许的一些解决方案抗争,但当应用程序增长时,这会有点混乱:P@PandiyanCool:这在我的问题中不起作用。你能帮我吗?请尝试使用match_短语:这不是一个匹配项。我需要一个通配符搜索。当我使用搜索尝试给定代码时,它不起作用。如何将字段更改为not分析?@DamForums如何创建索引,还是不创建?索引是在第一个文档被索引时创建的?@DamForums抱歉,我不是php高手,但这个链接可能会帮助你处理这个问题:是的,当第一个文档被创建时,索引就被创建了。@DamForums所以我想你必须显式地创建索引,在索引第一个文档之前。希望我以前的链接能为你指明一条路。
"full_name.raw" => "John Doe"