[英]elasticsearch: search for parts of words
我正在嘗試學習如何使用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
]],
],
]
]
]
];
如果您有大量數據,兩者都可以工作,但效果不佳。
正確的方法是使用帶有標准令牌生成器和ngram令牌過濾器的自定義分析器 ,以便將每個令牌切成小塊並將其切成小塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.