首页 > 解决方案 > 将两个单词作为一个单词进行加工

问题描述

考虑我有一个文档,其中包含以下内容的字段:5W30 QUARTZ INEO MC 3 5L

用户希望能够搜索MC3(无空格)并获取文档;但是,搜索MC 3(带空格)也应该有效。此外,可能存在内容不包含空格的文档,并且在使用空格进行查询时应该找到这些文档。

我尝试了不带空格的索引(例如5W30QUARTZINEOMC35L),但这并没有真正起作用,因为使用通配符搜索我会匹配太多,例如 MC35 也会匹配,我只想匹配两个连接在一起的确切单词(以及确切的单个单词)。

到目前为止,我正在考虑另外索引两个单词的所有组合,例如5W30QUARTZ, QUARTZINEO, INEOMC, MC3, 35L。但是,Elasticsearch 是否有针对此的原生解决方案?

标签: elasticsearchelasticsearch-queryelasticsearch-analyzers

解决方案


我很确定您可以使用shingle token filter完成您想要的操作。根据您的映射,我想您需要在内容字段中添加一个看起来像这样的过滤器,以使您的令牌成对索引:

"filter_shingle":{
   "type":"shingle",
   "max_shingle_size":2,
   "min_shingle_size":2,
   "output_unigrams":"true"
}

请注意,这也已经是默认配置,我只是为了清楚起见添加了它。


推荐阅读