elasticsearch,Php,elasticsearch" /> elasticsearch,Php,elasticsearch" />

Php 空间弹性搜索

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

我有一个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" => "\"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"