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

Php 不区分大小写的搜索不起作用

Php 不区分大小写的搜索不起作用,php,elasticsearch,Php,elasticsearch,考虑到这是我的映射和设置 $arr = [ 'index' => 'test1', 'body' => [ 'settings' => [ 'analysis' => [ 'analyzer' => [ 'name_analyzer' => [

考虑到这是我的映射和设置

$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"
                        ]
                    ]
                ]
            ]
        ]
    ];
索引后两个名称和地址为

  • abc某些地址1
  • Abc某些地址2
  • 当我搜索名称“A”时,结果中没有任何文档。
    但当我搜索名称“a”时,我会在结果中同时得到两个文档

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

    我的搜索查询

    $query['index'] = 'test1';
        $query['type']  = 'info';
        $query['body'] = [
            'query'=> [
                'bool' => [
                    'should' => [
                        [
                            'prefix' => [
                                'Name' => 'a'
                            ]
                        ]
                    ]
                ]
            ]
        ];
    
    正如文档所说,您使用的是一个,在查询时不会分析前缀。这意味着,如果将
    A
    作为前缀,它将不匹配任何内容,因为
    Name
    字段被小写

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

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

    $query['index'] = 'test1';
        $query['type']  = 'info';
        $query['body'] = [
            'query'=> [
                'bool' => [
                    'should' => [
                        [
                            'query_string' => [
                                'default_field' => 'Name',
                                'query' => 'A*',
                                'analyze_wildcard' => 'true'
                            ]
                        ]
                    ]
                ]
            ]
        ];
    
    正如文档所说,您使用的是一个,在查询时不会分析前缀。这意味着,如果将
    A
    作为前缀,它将不匹配任何内容,因为
    Name
    字段被小写

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

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

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

    请出示您的实际代码。如果您发布您的查询,这将很有帮助。有些查询,如术语查询,在查询时不会通过分析器,因此您不会得到任何结果。请显示您的实际代码。如果您发布查询,这将很有帮助。有些查询,如术语查询,在查询时不会通过分析器,因此不会得到任何结果。当然,此查询在结果中为我提供name=abc,但在结果中也需要“abc”。怎么做?前缀为
    a
    的前缀查询将为您提供
    name=abc
    name=abc
    。而带有
    A*
    A*
    的查询字符串也会给你们两个,我使用的是你们建议的同一个查询,这是我的输出结果
    {“take”:1,“timed\u out”:false,“\u shards:{“total”:5,“successful”:5,“failed”:0},“hits:{“total”:1,“max\u score”:1,“hits:[{u索引“:”test1“,”u类型“:”info“,”u id“:”1“,”u分数“:”1“,”u来源“:{”姓名“:”abc“,”地址“:”CHembur Mum.81”}]}
    我的结果中没有name='Abc'。为什么它不起作用呢?刚刚用两个文档name=Abc和name=Abc创建了你的索引,一切似乎都正常:对不起,我的错误,出于测试目的,我用未分析的name重新创建了映射。对不起,它起作用了。当然,这个查询的结果中有name=Abc,但我的结果中也需要'Abc'。怎么做呢?前缀为
    a
    的前缀查询将同时为您提供
    name=abc
    name=abc
    。带有
    a*
    a*
    的查询字符串也将为您提供这两个前缀。我正在使用您建议的相同查询,这是我的输出结果
    {“take”:1,“timed\u out”:false,“\u shards”:{“总计”:5,“成功”:5,“失败”:0},“点击次数”:{“总计”:1,“最高分数”:1,“点击次数”:[{“索引”:“测试1”,“类型”:“信息”,“id”:“1”,“分数”:1”,“来源”:{“姓名”:“abc”,“地址”:“CHembur妈妈81”}}}
    我没有得到name='Abc'的结果。为什么它不起作用呢?刚刚用两个文档name=Abc和name=Abc创建了索引,似乎一切都正常:对不起,我的错误,出于测试目的,我重新创建了名为未分析的映射。对不起,它起作用了