我的网站上有弹性搜索功能,我可以搜索漂亮的搜索。我的问题是,当我搜索HipHop和Hip Hop,或手机与手机之类的东西时,第一个文本查询的结果不会出现。我想这样做,如果用户搜索带有或没有空格的单词,结果将是相同的。这是我的搜索代码的样子。我使用的是Laravel 5
$q = $request->input('q');
$response = $client->search([
'index' => 'users',
'type' => 'user',
'body' => [
'query' => [
'bool' => [
'should' => [
['match' => [ 'text' => $q ] ],
],
],
],
],
]);
答案 0 :(得分:1)
首先,您必须了解索引流程,如果您没有更改默认映射,基本上您的字符串将通过default analyser传递。
HipHop会保持不变
嘻哈分开保存,如Hip,Hop
当您使用HipHop与Hip Hop进行匹配查询时,此查询也会通过分析器传递,并将分离为:" HipHop,vs,Hip,Hop"和一个布尔查询将进行如下搜索:"匹配HipHop?","匹配vs那里?","匹配Hip那里?" ,"匹配跳到那里?" ?
如果你想要一个你有HipHop索引并且用户搜索Hip Hop或HipHop vs Hip Hop或HopHip并且应该返回HipHop的场景,你必须实现一些策略,如:
正则表达式或前缀查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html
部分匹配的Ngram:https://www.elastic.co/guide/en/elasticsearch/guide/current/_ngrams_for_partial_matching.html
同义词:https://www.elastic.co/guide/en/elasticsearch/guide/current/using-synonyms.html
如果你想让你的空间与#34; Hip Hop"你需要使用not_analyzed映射。