如何在Elasticsearch中配置字段与查询,实现指定关键词检索目标文档?
Elasticsearch实现术语关联检索方案
核心思路
要让检索debit或credit时匹配到包含card的文档,关键是建立术语间的同义词映射,通过Elasticsearch的同义词分析器实现搜索词与目标术语的关联转换。
步骤1:创建带同义词分析器的索引映射
先创建(或更新)索引配置,定义自定义分析器和同义词过滤器:
PUT /idx_name { "settings": { "analysis": { "filter": { "card_synonym_filter": { "type": "synonym", "synonyms": [ "debit, credit => card" ] } }, "analyzer": { "card_synonym_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "card_synonym_filter" ] } } } }, "mappings": { "_doc": { "properties": { "title": { "type": "text", "analyzer": "card_synonym_analyzer", "search_analyzer": "card_synonym_analyzer" } } } } }
配置说明
card_synonym_filter:定义同义词规则,debit, credit => card表示搜索debit或credit时,会被转换为card进行匹配。card_synonym_analyzer:组合标准分词器、小写过滤器和同义词过滤器,确保搜索词和文档内容的统一处理。
步骤2:重新导入目标文档
由于修改了索引的分析器配置,需要将原文档重新索引到该索引中:
PUT /idx_name/_doc/82000223323 { "title": "where is my card?" }
步骤3:执行检索查询
使用match查询即可实现需求,示例如下:
检索debit的查询语句
POST /idx_name/_search { "query": { "match": { "title": "debit" } } }
检索credit的查询语句
POST /idx_name/_search { "query": { "match": { "title": "credit" } } }
以上两种查询都会返回目标文档。
备选方案(无需修改映射)
如果不想修改索引映射,也可以直接在查询中通过布尔查询关联术语:
POST /idx_name/_search { "query": { "bool": { "should": [ {"match": {"title": "debit"}}, {"match": {"title": "credit"}}, {"match": {"title": "card"}} ] } } }
不过这种方案灵活性较差,后续新增关联术语时需要修改查询语句,推荐优先使用同义词分析器方案。
内容的提问来源于stack exchange,提问作者Sukeesh
相关产品推荐
相关产品推荐

