我正在尝试学习如何使用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%'?
答案 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 analyzer和ngram token filter,以便将每个标记切片并切成小标记。