设计网站推荐知乎,关键词挖掘查询工具爱站网,ps企业网站模板免费下载,网红营销正排索引 和 倒排索引
正排索引#xff1a;通过id #xff0c;查询content
倒排索引#xff1a;通过content#xff0c;查询到符合的 ids
eg#xff1a;
正排索引就是通过《静夜思》#xff0c;找到整片文章。
倒排索引通过“明月”#xff0c;找到《静夜思》 《望…正排索引 和 倒排索引
正排索引通过id 查询content
倒排索引通过content查询到符合的 ids
eg
正排索引就是通过《静夜思》找到整片文章。
倒排索引通过“明月”找到《静夜思》 《望月怀古》《关山月》等
get 查询
索引的基本信息
GET your_index/_mapping //跟看mysql表字段差不多 GET your_index/_alias //查看索引的别名 GET /_cat/health?v //查看集群状态 GET _cat/indices // 查看所有index GET _cat/shards/your_index //查看指定索引的分片数每个分片有主p副r分片
查询索引内容
match_all GET /you_index/_search
{query:{match_all: {}
}bool
bool查询是一个非常强大且常用的复合查询它允许你组合多个查询条件。bool 查询的核心概念包括以下四种子句
must: 子句必须匹配文档。类似于 SQL 中的 AND 操作符。filter: 子句必须匹配文档但不影响评分。也就是说它只过滤文档但不参与评分计算。should: 子句可以匹配文档。如果在一个 bool 查询中包含了多个 should 子句则至少一个 should 子句必须匹配文档。类似于 SQL 中的 OR 操作符。must_not: 子句不能匹配文档。类似于 SQL 中的 NOT 操作符。
eg
GET you_index/_search
{query: {bool: {must: [{bool: {should: [{term: {name: {value: 林俊凯,boost: 1}}},{term: {zh_name: {value: 林俊凯,boost: 1}}}]}},{bool: {should: [{range: {fans_num: {gte: 800}}},{terms: {tag: [1010,1013]}}]}}]}},sort: {_score: {order: desc},score: {order: desc}}
}
range range: {fans_num: {gte: 800,lte:126334}}
gte大于等于lte小于等于
term 不分词精准完全匹配查询
GET your_index_search/_search
{query: {term: {name: {value: 天空}}}
}
terms
不分词命中数组一个即可不要求全部命中
GET your_index_search/_search
{query: {terms: {tag: [美食,购物]}}
}
prefix
前缀匹配不分词 精准匹配前半部分
GET your_index_search/_search
{query: {prefix: {name_full: {value: 林俊}}}
}
林俊凯林俊xxx都会命中
multi_match
会对query词进行分词
GET your_index_search/_search
{query: {bool: {must: [{multi_match: {query: 北京景点,fields: [name,name_full, name_lower],analyzer:ik,minimum_should_match:380%}}]}}
}这里的 minimum_should_match: 380% 指定了如下规则 如果分词数量小于或等于 3则必须匹配所有分词。 如果分词数量大于 3则至少匹配 80% 的分词。
这里的“analyzer”是分词器常见的有ik ik-smart standard mla
GET _analyze
{analyzer:mla,text:北京景点
}//结果为
{tokens: [{token: 北京,start_offset: 0,end_offset: 2,type: CN_WORD,position: 0},{token: 景点,start_offset: 2,end_offset: 4,type: CN_WORD,position: 1}]
}eg“北京景点”分词为【北京景点】分词项为2小于3那么【北京】和【景点】都需要在field中匹配到。multi_match 查询的目的是在多个字段中搜索查询词中的词语并且匹配规则会跨字段应用比如 【北京】在name匹配到【景点】在name_lower配到到即匹配成功。
multi_phrase
会对query词进行分词有的人会认为不会分词❌match_phrase要求严格不仅要求要能够匹配到分词后的所有单词且分词后的单词顺序也要和命中结果中的顺序保持一致。
GET your_index_search/_search
{query: {bool: {must: [{match_phrase: {name: 北京}}]}}
}
name “北京”能找到“北 京” 或者“京北” 就找不到
可以设置slop最大间隔默认是0
match
会分词没有multi_phrase那么严格match要求不高只要匹配到分词后的任意一个单词就算查到结果 。
为什么match能找到term查询不到呢
首先要看创建索引的时候mapping 字段的类型。如果是type是keyword不允许分词。
其次查看字段类型发现是textterm查询的字段类型只能是keyword
keyword_full: {type: text,fields: {keyword: {type: keyword}}},