Case-Insensitive搜索不起作用

时间:2015-07-28 09:36:01

标签: php elasticsearch

考虑这是我的映射和设置

$arr = [
        'index' => 'test1',
        'body' => [
            'settings' => [
               'analysis' => [
                    'analyzer' => [
                            'name_analyzer' => [
                            'type' => 'custom',
                            'tokenizer' => 'standard',
                            'filter' => [
                              'lowercase',
                              'asciifolding',
                              'word_delimiter'
                            ]
                        ]
                    ]
                ]
            ],
            "mappings" => [
                "info" => [
                    "properties" => [
                        "Name" => [
                            "type" => "string",
                            "index" => "analyzed",
                            "analyzer" => "name_analyzer"
                        ],
                        "Address" => [
                            "type" => "string",
                            "index" => "analyzed",
                            "analyzer" => "name_analyzer"
                        ]
                    ]
                ]
            ]
        ]
    ];

指数二后名称&地址为

  1. abc some_address1
  2. Abc some_address2
  3. 当我搜索姓名'A'时,我没有得到任何结果文件。
    但是当我搜索名称'a'时,我得到结果中的两个文件

    所以我的问题是即使我设置了分析器,为什么我的搜索不区分大小写?

    我的搜索查询

    $query['index'] = 'test1';
        $query['type']  = 'info';
        $query['body'] = [
            'query'=> [
                'bool' => [
                    'should' => [
                        [
                            'prefix' => [
                                'Name' => 'a'
                            ]
                        ]
                    ]
                ]
            ]
        ];
    

1 个答案:

答案 0 :(得分:0)

您正在使用prefix query,正如文档所述,在查询时不会分析前缀。这意味着如果您将A作为前缀,它将无法匹配任何内容,因为Name字段正在小写。

因此,如果您想继续使用前缀查询,我建议您手动小写前缀。

如果这不是一个选项,您可以使用带有通配符的query string,如下所示:

$query['index'] = 'test1';
    $query['type']  = 'info';
    $query['body'] = [
        'query'=> [
            'bool' => [
                'should' => [
                    [
                        'query_string' => [
                            'default_field' => 'Name',
                            'query' => 'A*',
                            'analyze_wildcard' => 'true'
                        ]
                    ]
                ]
            ]
        ]
    ];