我正在尝试学习如何使用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 analyzer和ngram token filter,以便将每个 token 切成小块。
关于php - elasticsearch:搜索词的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37315275/