Elasticsearch配置search_analyzer后term查询不生效问题咨询
问题原因
term查询属于精确匹配类查询,不会对输入的搜索字符串执行任何分词处理,也不会调用字段配置的search_analyzer,会直接将输入的完整字符串和倒排索引中存储的分词结果做精确匹配。
你所有文档的myField字段分词后生成的分词项只有asd9887,而查询2中term查询输入的字符串是asd 9887,两者完全不匹配,因此返回空结果。
你在mapping中配置的search_analyzer仅会作用于全文检索类查询(比如match、match_phrase等),不会作用于term级别的精确查询,因此查询2中不会触发你配置的自定义分词器。
另外你写的查询3中手动指定analyzer属于冗余配置,只要使用match查询,默认就会自动调用myField配置的search_analyzer,无需额外声明。
解决方案
不需要额外修改索引配置,也不需要用户感知分词器存在,只需要将查询语句中的term替换为match即可,match查询会自动调用你为myField配置的search_analyzer对用户输入的查询内容做分词处理,匹配到对应文档:
GET /my-index-001/_search { "query": { "match": { "myField": "asd 9887" } } }
该语句执行时会自动将用户输入的asd 9887处理为asd9887,和文档分词结果匹配,即可命中全部符合要求的2条文档。
如果一定要保留term查询的原有写法,只能要求用户提前处理输入的搜索词,去掉所有非字母数字字符并转为全小写,该方案违背了自定义分词器简化用户输入的设计初衷,不推荐使用。
内容的提问来源于stack exchange,提问作者Cássio
相关产品推荐
相关产品推荐

