「這是我參與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)互相學習、互相交流。