搜索时从Elasticsearch中排除空格

时间:2016-08-31 21:40:59

标签: elasticsearch laravel-5

我的网站上有弹性搜索功能,我可以搜索漂亮的搜索。我的问题是,当我搜索HipHop和Hip Hop,或手机与手机之类的东西时,第一个文本查询的结果不会出现。我想这样做,如果用户搜索带有或没有空格的单词,结果将是相同的。这是我的搜索代码的样子。我使用的是Laravel 5

 $q = $request->input('q');
  $response = $client->search([
        'index' => 'users',
        'type' => 'user',
        'body' => [
            'query' => [
                'bool' => [
                    'should' => [
                        ['match' => [ 'text' => $q ] ],
                    ],
                ],  
            ],
        ],
    ]);

1 个答案:

答案 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映射。