“这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战”java
上一篇介绍了ElasticSearch核心基础语法第四篇,本节介绍ElasticSearch核心语法第五篇。python
在搜索时,对搜索条件尽量多字段的匹配,哪一个字段匹配相关度分高,就排在前边。json
文档数据以下:微信
PUT /zoe_article/_doc/1
{
"name": "zhangsan",
"remark":"developer"
}
PUT /zoe_article/_doc/2
{
"name": "zhangsan",
"remark":"java developer"
}
PUT /zoe_article/_doc/3
{
"name": "lisi",
"remark":"java developer"
}
PUT /zoe_article/_doc/4
{
"name": "lisi",
"remark":"python developer"
}
复制代码
输入 "java developer zhangsan" 时,搜索结果以下:markdown
GET /zoe_article/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"name": "zhangsan"
}
},
{
"match": {
"remark": "java developer"
}
}
]
}
}
}
复制代码
直译为穿过多个字段,就是在多个字段中进行搜索。app
搜索条件中的java必须在name或remark字段中匹配,developer也必须在name或remark字段中匹配。post
GET /zoe_article/_search
{
"query": {
"multi_match": {
"query": "java developer",
"fields": [
"name",
"remark"
],
"type": "cross_fields",
"operator": "and"
}
}
}
复制代码
copy_to:将多个字段复制到一个字段中,实现一个多字段组合。学习
若是在搜索框内输入“电脑”,点击搜索,那么是在商品属性哪一个字段内进行数据匹配?若是使用_all作搜索也不合适,有些字段并不匹配,那是否能够在指定哪些字段中进行数据匹配呢?copy_to就能够实现。spa
若是须要使用copy_to语法,则须要在定义index的时候,手工指定mapping映射策略。3d
copy_to语法:
PUT /user_address/_mapping
{
"properties": {
"provice": {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"city": {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"street": {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"address": {
"type": "text",
"analyzer": "standard"
}
}
}
复制代码
match phrase短语搜索,就是搜索条件不分词,表明搜索条件不可分割。
GET /zoe_article/_search
{
"query": {
"match_phras": {
"remark": "java developer"
}
}
}
复制代码
前缀搜索,一般对keyword类型的字段进行搜索,也就是不进行分词的字段。
对title字段进行前缀搜索。
GET /zoe_article/_search
{
"query": {
"prefix": {
"title.keyword": {
"value": "掘金社区"
}
}
}
}
复制代码
GET /zoe_article/_search
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "掘金社区",
"slop": 10,
"max_expansions": 10
}
}
}
}
复制代码
slop移动次数范围内,前缀匹配(s),max_expansions是用于指定prefix最多匹配多少个term(单词),超过这个数量就再也不匹配了。
ElasticSearch搜索语法太多了,针对不一样的场景基本上都有对应的语法,能够参考官网进行进一步的阅读查询。
欢迎你们关注微信公众号(MarkZoe)互相学习、互相交流。