elasticsearch初学者常遇到错误

一、 查询

 
1.嵌套文档的查询(nested)
 
认为嵌套文档查出来的结果里面,只会把符合查询条件的嵌套层内容查出来,其实,他是把嵌套层对应的整个document查出来,所有需要进行过滤。
 
举个例子
(1)索引设计如下的
{
  "settings": {
    "index": {
      "number_of_shards": "8",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "faq_industry_and_custom_duplication": {
      "dynamic": "false",
      "_all": {
        "enabled": false
      },
      "properties": {
        "botId": {
          "type": "keyword"
        },
        "similarityNum": {
          "type": "integer"
        },
        "questionSet": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "keyword"
            },
            "question": {
              "type": "keyword"
            }
        }
      }
    }
  }
}

 

 
(2)加入索引里只有一条数据如下
{
    "botId":"23",
    "similarityNum":3,
    "questionSet":[
        {
            "id":"a1",
            "question":"神州五号 飞天"
        },
        {
            "id":"a2",
            "question":"神州七号 飞天"
        }
    ]
}

 

 
(3)查询库里 quetionSet中question 含有 "神州五号”的qustion
 
{
    "query": {
       "bool":{
            "must":[
                {
                    "match_phrase":{
                        "questionSet.question": "神州五号"
                    }
                }
                
            ]
        }
    }
}

 

 
(4)查询的结果,其实就是(2)中的数据,其实含有"神州五号”这个document 会都被查出来, 内嵌的 "question":"神州七号 飞天” 也被查出来 ,所以在使用查询的结果, 还是要把内嵌的不符合要求的结果给去除。
 
2.索引中字段设计与查询语句不匹配
 
(1)在es 6.3.x版本中,索引设计时使用 text,而查询使用了term。
 
a. 索引设计
"question": {
              "type": "text"
 }

 

 
b.数据
{"question”: “心情好”},
{"question”: “心情糟糕”},
{"question”: “心情好差"}

 

 
c.查询
{
   "term":{
       "question": "心情好"
    }
}

 

该查询语句会把b中的三个数据全部查询出来,因为,在a中的索引设计是text,是默认分词,把每个汉字分开,在适应term其实和match的效果是一样的。
 
 

你可能感兴趣的:(服务器)