参考:https://blog.csdn.net/winterking3/article/details/108254346
https://www.cnblogs.com/shoufeng/p/11103913.html
https://blog.csdn.net/tclzsn7456/article/details/79956625
默认mapping结构一般是:
如果不设置mapping,ES默认把字符串设为text类型,并包含一个keyword子类型。

***这种结构保存字段会存两份索引(个人理解),首先第一个type text这个会进行分词建索引保存,再后面fields keyword会进行保存完整字符串附加
所以一个articleID过来的时候,会建立两次索引。一次是自己本身(articleID),是要分词的,分词后放入倒排索引;另一次是基于articleID.keyword,不分词,最多保留256字符,直接一个完整的字符串放入倒排索引中
1)直接term
(结构查不到,这是因为不加任何默认是text类型,这个字段保存是有分词,比如电影分成了电和影两个字保存)
{
"query": {
"bool": {
"must": [
{
"term": {
"channel": "电影"
}
}
]
}
}
}
索引这里改成单字查询可以查询到
{
"query": {
"bool": {
"must": [
{
"term": {
"channel": "电"
}
}
]
}
}
}
##或
{
"query": {
"bool": {
"must": [
{
"term": {
"channel": "影"
}
}
]
}
}
}
或者用match查询,这会进行分词后再查询
{
"query": {
"bool": {
"must": [
{
"match": {
"channel": "电影"
}
}
]
}
}
}
2)具体全匹配查询term+keywod
这种查询会依据mapping里子类型keyword字段匹配,必须包含查询字符串不分词,相当于是查询的不分词前的原来字符串
{
"query": {
"bool": {
"must": [
{
"term": {
"channel.keyword": "电影"
}
}
]
}
}
}
直接去掉text那一级,吧text直接改成keyword,这种皆可以直接进行term查询进行不分词全匹配了,不用再加keyword
#设置channel为keyword
PUT pigg_user
{
"mappings": {
"properties": {
"channel": {
"type": "keyword"
},
"age": {
"type": "short"
}
}
}
}