目录
掌握es短语查询语法,通过设置slop参数控制短语搜索允许的分词间隔数量。
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=2可以解决默认相隔字段为0的问题。
- GET /match_phrase_db2/_search
- {
- "query": {
- "match_phrase": {
- "content": {
- "query": "安徽风景区",
- "slop": 2
- }
- }
- }
- }