我的网站上的 Elasticsearch 效果很好,我可以搜索到相当不错的血统。我的问题是,当我在诸如HipHop与Hip Hop或手机与手机之类的内容上进行搜索时,我的第一个文本查询结果不会出现。我要这样做,以便用户搜索带有或不带有空格的单词时,结果都是一样的。这是我要搜索的代码的样子。我正在使用Laravel 5
$q = $request->input('q');
$response = $client->search([
'index' => 'users',
'type' => 'user',
'body' => [
'query' => [
'bool' => [
'should' => [
['match' => [ 'text' => $q ] ],
],
],
],
],
]);
最佳答案
首先,您必须了解索引过程,如果不更改默认映射,则基本上是将字符串通过default analyser传递。
HipHop将保持不变
嘻哈像嘻哈,跳一样分开保存
当您像使用HipHop vs Hip Hop的示例进行匹配查询时,该查询也会通过分析器传递,并且将被分隔为:“HipHop,vs,Hip,Hop”和一个 bool(boolean) 型查询,将执行以下搜索: “匹配HipHop?”,“匹配vs?”,“匹配Hip?”,“匹配Hop?”。 ?
如果您想为HipHop编制索引并且用户搜索Hip Hop或HipHop与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
而且,如果要保留带有像“嘻哈”这样的索引空间的术语,则需要使用not_analyzed映射。
关于elasticsearch - 搜索时从Elasticsearch中排除空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259450/