将两个单词作为一个单词
Maching two words as a single word
假设我有一个文档,其中包含一个包含以下内容的字段:5W30 QUARTZ INEO MC 3 5L
用户希望能够搜索MC3
(没有space)并获取文档;但是,搜索 MC 3
(使用 spaces)也应该有效。此外,可以有内容没有 spaces 的文档,并且应该在使用 space.
查询时找到。
我尝试在没有 spaces 的情况下进行索引(例如 5W30QUARTZINEOMC35L
),但这并不能真正起作用,因为使用通配符搜索我会匹配太多,例如MC35 也会匹配,我只想匹配两个连接在一起的精确单词(以及精确的单个单词)。
到目前为止,我正在考虑另外索引两个词的所有组合,例如5W30QUARTZ
、QUARTZINEO
、INEOMC
、MC3
、35L
。但是,Elasticsearch 是否有针对此的原生解决方案?
我很确定您想要的可以用 shingle token filter 完成。根据您的映射,我想您需要在您的内容字段中添加一个看起来像这样的过滤器,以使您的令牌成对索引:
"filter_shingle":{
"type":"shingle",
"max_shingle_size":2,
"min_shingle_size":2,
"output_unigrams":"true"
}
请注意,这也已经是默认配置,我只是为了清楚起见才添加它。
假设我有一个文档,其中包含一个包含以下内容的字段:5W30 QUARTZ INEO MC 3 5L
用户希望能够搜索MC3
(没有space)并获取文档;但是,搜索 MC 3
(使用 spaces)也应该有效。此外,可以有内容没有 spaces 的文档,并且应该在使用 space.
我尝试在没有 spaces 的情况下进行索引(例如 5W30QUARTZINEOMC35L
),但这并不能真正起作用,因为使用通配符搜索我会匹配太多,例如MC35 也会匹配,我只想匹配两个连接在一起的精确单词(以及精确的单个单词)。
到目前为止,我正在考虑另外索引两个词的所有组合,例如5W30QUARTZ
、QUARTZINEO
、INEOMC
、MC3
、35L
。但是,Elasticsearch 是否有针对此的原生解决方案?
我很确定您想要的可以用 shingle token filter 完成。根据您的映射,我想您需要在您的内容字段中添加一个看起来像这样的过滤器,以使您的令牌成对索引:
"filter_shingle":{
"type":"shingle",
"max_shingle_size":2,
"min_shingle_size":2,
"output_unigrams":"true"
}
请注意,这也已经是默认配置,我只是为了清楚起见才添加它。