Elasticsearch笔记(8)

161 阅读2分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

备注:继Elasticsearch笔记(7)

match 扩展
operator(或者与并且)
  • or:搜索内容分词后,只要存在一个词语匹配就展示结果
  • and:搜索内容分词后,都要满足词语匹配
#POST     /{index}/_doc/_search
{
    "query": {
        "match": {
            "desc": {
                "query": "xbox游戏机",
                "operator": "or"
            }
        }
    }
}
# 相当于 select * from shop where desc='xbox' or|and desc='游戏机'
minimum_should_match(最低精度搜索)
  • minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。

  • minimum_should_match 也能设置具体的数字,表示个数

    #POST     /{index}/_doc/_search
    {
        "query": {
            "match": {
                "desc": {
                    "query": "女友生日送我好玩的xbox游戏机",
                    "minimum_should_match": "60%"
                }
            }
        }
    }
    
  • 查询多个(依据id)

    #POST     /{index}/_doc/_search
    
    {
        "query": {
            "ids": {
                "type": "_doc",
                "values": ["1001", "1010", "1008"]
            }
        }
    }
    

    DSL搜索 - multi_match/boost

multi_match(多字段搜索)

满足使用match在多个字段中进行查询的需求

# POST     /{index}/_doc/_search
{
    "query": {
        "multi_match": {
                "query": "黄某人来着广东",
                "fields": ["comfrom", "nickname"]

        }
    }
}
boost(搜索权重)

权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。

POST     /{index}/_doc/_search
{
    "query": {
        "multi_match": {
                "query": "黄某人来着广东",
                "fields": ["comfrom", "nickname^10"]

        }
    }
}
布尔查询

可以组合多重查询

  • must:查询必须匹配搜索条件,譬如 and
  • should:查询匹配满足1个以上条件,譬如 or
  • must_not:不匹配搜索条件,一个都不要满足

实操must:

# POST /{index}/_doc/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "黄某人",
                        "fields": ["comfrom", "nickname"]
                    }
                },
             
                {
                    "term": {
                        "birthday": "1995-10-28"
                    }
                }
            ]
        }
    }
}
#查询结果
{
    "took": 20,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}

实操should:

# POST /{index}/_doc/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "multi_match": {
                        "query": "黄某人",
                        "fields": ["comfrom", "nickname"]
                    }
                },
             
                {
                    "term": {
                        "birthday": "1995-10-28"
                    }
                }
            ]
        }
    }
}
#查询结果
{
    "took": 38,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "jacuesh",
                "_type": "_doc",
                "_id": "1001\n",
                "_score": 0.2876821,
                "_source": {
                    "id": 1001,
                    "age": 31,
                    "username": "黄某人",
                    "nickname": "老黄",
                    "comefrom": "广东省深圳市",
                    "sex": 1,
                    "birthday": "1995-10-29",
                    "class": "计算机科学以技术1班"
                }
            }
        ]
    }
}