视频网站用什么cms,优秀网站建设哪家便宜,网站面包屑如何做,国产wordpress模板es 匹配逻辑
根本#xff1a;es 的匹配是基于token 的。检索的query和目标字段在token 层级上有交集才能检索成功。对同样的文本#xff0c;使用不同的分词器#xff0c;所得token 不同。es 默认的analyzer(分词器)是standard模式#xff0c;即按字切分。
基本上#xf…es 匹配逻辑
根本es 的匹配是基于token 的。检索的query和目标字段在token 层级上有交集才能检索成功。对同样的文本使用不同的分词器所得token 不同。es 默认的analyzer(分词器)是standard模式即按字切分。
基本上如果query 使用match 可以查到结果而term 查不到就是query 本身没有作为一个token在es 中存在。
实例分析
# 设置mapping可指定每个字段的type、analyzer如果不设置es 会自动创建typedoc {mappings: {properties: {name: {type: text,analyzer: whitespace},age: {type: integer}}}}# 创建索引同时指定mappinges.indices.create(indextt, bodydoc)# 录入数据
# 小 明明对应的token [小 明明]xiaoming {name: 小 明明,age: 10}
# 李 东东对应的token [李, 东东]dongdong {name: 李 东东,age: 9}es.index(indextt, id1, documentxiaoming)es.index(indextt, id2, documentdongdong)# 使用 “李 明明” 作为query 检索ts {query: {term: {name: 李 明明}}}ts2 {query: {match: {name: {query: 李 明明,analyzer: whitespace}}}}ts3 {query: {match: {name: {query: 李 明明}}}}res es.search(indextt, bodyts) # 结果为空res2 es.search(indextt, bodyts2) # 小 明明 和 李 东东都能检索出来res3 es.search(indextt, bodyts3) # 李 东东能检索出来
上例中对于ts 采用term 方式检索term是不分词的相当于采用keyword 分词器因此token[李 明明]显然对于索引 tt不存在这样的token因此无法检索到信息。
对于ts2采用match 方式检索分词器为whitespacetoken[李明明]因此和[小, 明明]存在交集【明明】和[李 东东]存在交集【李】。所以两条数据都能检索出来。
对于ts3采用match 方式检索没有指定分词器默认为standardtoken[李明明]和[李 东东]存在交集【李】。所以李 东东能检索出来。