elasticsearch:搜索部分单词

时间:2016-05-19 06:19:18

标签: php elasticsearch

我正在尝试学习如何使用elasticsearch(使用elasticsearch-php进行查询)。我插入了一些数据,如下所示:

after_initialize

现在我创建了一个搜索查询,如下所示:

['id' => 1, 'name' => 'butter', 'category' => 'food'], 
['id' => 2,'name' => 'buttercup', 'category' => 'food'],
['id' => 3,'name' => 'something else', 'category' => 'butter'] 

其中$ val是搜索词。这很好用,我唯一的问题是:当我搜索“黄油”时,我会发现ID 1和3,但不是2,因为searchterm似乎只匹配确切的单词。有没有办法搜索“在单词内”,或者用mysql术语来搜索WHERE名称LIKE'%val%'?

1 个答案:

答案 0 :(得分:1)

您可以尝试wildcard查询

$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['wildcard' => [
                        'name' => [
                            'query' => '*'.$val.'*',
                            'boost' => 7
                        ]
                    ]],
                    ['wildcard' => [
                        'category' => [
                            'query' => '*'.$val.'*',
                            'boost' => 5
                        ]
                    ]],
                ],
            ]
        ]
    ]
];

query_string查询。

$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['query_string' => [
                        'default_field' => 'name',
                        'query' => '*'.$val.'*',
                        'boost' => 7
                    ]],
                    ['query_string' => [
                        'default_field' => 'category',
                        'query' => '*'.$val.'*',
                        'boost' => 7
                    ]],
                ],
            ]
        ]
    ]
];

如果您有大量数据,两者都可以正常工作,但效果并不高。

执行此操作的正确方法是使用带有标准标记符的custom analyzerngram token filter,以便将每个标记切片并切成小标记。

相关问题