如何在OpenSearch的flat_object字段中实现单词检索?
实现flat_object字段内单词检索的最优方案
问题原因
flat_object类型默认会将嵌套对象序列化为单个字符串,并以keyword类型存储。keyword类型不分词,因此只能通过完全匹配整个字符串检索,无法匹配字符串内的单个单词。
最优解决方案
重新定义索引映射,将payload字段设置为flat_object类型的同时,指定其采用可分词的text类型并配置合适的分词器(如标准分词器standard)。这样既保留flat_object扁平化存储的性能优势,又能让序列化后的字符串被分词,支持单个单词检索。
步骤1:创建带正确映射的新索引
PUT myindex { "mappings": { "properties": { "header": { "properties": { "messageId": { "type": "keyword" } } }, "payload": { "type": "flat_object", "analyzer": "standard" } } } }
步骤2:重新导入文档
PUT myindex/_doc/5 { "header": { "messageId": "5" }, "payload": { "error": { "field1": "field1value", "field2": "words i'd like to be able to search on" } } }
步骤3:测试单个单词检索
GET myindex/_search { "query": { "match": { "payload": "search" } } }
此时该查询就能成功匹配到目标文档。
备选方案(无法重建索引时)
如果无法重建索引,可以使用runtime字段在查询时动态对payload字段进行分词处理,但这种方式会增加查询阶段的性能开销,仅作为临时替代方案:
GET myindex/_search { "runtime_mappings": { "payload_text": { "type": "text", "analyzer": "standard", "script": { "source": "emit(doc['payload'].value)" } } }, "query": { "match": { "payload_text": "search" } } }
内容的提问来源于stack exchange,提问作者andyd
相关产品推荐
相关产品推荐

