目录
目标
掌握es短语查询语法,通过设置slop参数控制短语搜索允许的分词间隔数量。
ES版本信息
7.17.5
官方文档
短语查询的作用
对关键词进行分词,并要求分词在字段中都存在,且分词顺序相同。且默认分词间没有间隔。
实战
创建索引和文档
#索引1
PUT /match_phrase_db
{
}
PUT /match_phrase_db/_doc/1
{
"content":"I love you three thousand times a day"
}
PUT /match_phrase_db/_doc/2
{
"content":"我去过安徽的黄山"
}
PUT /match_phrase_db/_doc/3
{
"content":"I don't love you very much"
}
#索引2
PUT /match_phrase_db2
{
"settings": {
"index": {
"analysis.analyzer.default.type": "ik_max_word"
}
}
}
PUT /match_phrase_db2/_doc/1
{
"content":"云南省云南白药厂"
}
PUT /match_phrase_db2/_doc/2
{
"content":"安徽黄山风景区"
}
基本语法
需求一:搜索条件为"I love you",对应的搜索字段是content,要求字段中必须存在"I love you"短语,且各个分词之间没有间断。
GET /match_phrase_db/_search
{
"query": {
"match_phrase": {
"content": "I love you"
}
}
}
需求二:短语搜索条件为"安徽黄山"。
GET /match_phrase_db/_search
{
"query": {
"match_phrase": {
"content": "安徽黄山"
}
}
}
总结:需求一只查出了id=1的文档,id=3的文档没有查出来是因为中间有其他分词;需求一没有查出结果,也是因为中间间隔了其他分词。
易错点解析
易错点:顺序相同不是指字段值的内容完全包含关键词,而是指分词顺序相同。
需求一:短语搜索"黄山风景"。
GET /match_phrase_db2/_search
{
"query": {
"match_phrase": {
"content": "黄山风景"
}
}
}
POST _analyze
{
"text": "安徽黄山风景区",
"analyzer": "ik_max_word"
}
分析:结果集为空,对"安徽黄山风景区"和"黄山风景"分词,发现分词"山风"和"风景"之间还间隔了"风景区"这个分词,所以不符合条件。
设置slop解决分词间隔数量
需求:短语搜索"安徽风景区",要求可以查到第一条文档。
分析:对第一条文档中的字段分词,"安徽黄山风景区"分词后发现安徽距离风景区相差两个字段,所以设置slop=2可以解决默认相隔字段为0的问题。
GET /match_phrase_db2/_search
{
"query": {
"match_phrase": {
"content": {
"query": "安徽风景区",
"slop": 2
}
}
}
}