php - elasticsearch:搜索词的一部分

标签 php elasticsearch

我正在尝试学习如何使用elasticsearch(使用elasticsearch-php进行查询)。我插入了一些数据,看起来像这样:

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

现在,我创建了一个搜索查询,如下所示:
$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['match' => [
                        'name' => [
                            'query' => $val,
                            'boost' => 7
                        ]
                    ]],
                    ['match' => [
                        'category' => [
                            'query' => $val,
                            'boost' => 5
                        ]
                    ]],
                ],
            ]
        ]
    ]
];

其中$ val是搜索词。这很好用,这是我唯一的问题:当我搜索“黄油”时,我发现编号1和3,而不是2,因为searchterm似乎只匹配确切的单词。有没有一种方法可以搜索“单词内”,或者用mysql术语执行类似WHERE name LIKE'%val%'的操作?

最佳答案

您可以尝试 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
                    ]],
                ],
            ]
        ]
    ]
];

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

正确的方法是使用带有标准 token 生成器的custom analyzerngram token filter,以便将每个 token 切成小块。

关于php - elasticsearch:搜索词的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37315275/

相关文章:

php - 如何在 WordPress 中动态启用/禁用插件?

php - 如果没有 GROUP BY 子句,没有 GROUP 列的 MySQl 错误 : #1140 - Mixing of GROUP columns (MIN(), MAX(),COUNT(),...) 是非法的

elasticsearch - Elasticsearch分组依据字段

elasticsearch - 与第一个搜索词相对应的Elastic Search Boost查询

PHP Guzzle POST 请求返回 Null

php - bcrypt 哈希值应该存储在主用户表中还是它自己的表中?

javascript - 未授权用户的单独页面或同一页面的不同配置?

python - 如何将ES中的每个数据设置为未分析?

node.js - Elasticsearch 对部分字符串而非完整字符串进行聚合

elasticsearch - 从Elasticsearch数据源获取Grafana中的最新元素