elasticsearch 布爾表達(dá)式在競價(jià)廣告中的檢索使用

Elasticsearch 在競價(jià)廣告中的檢索使用

一疾牲、廣告定向簡述

1.1 在競價(jià)廣告中的定向條件往往如下所示

  • ad1 定向?yàn)榈赜虮本?上海,廣州,深圳,18~28歲的旅游,健身行業(yè)男性,并且要求適用的操作系統(tǒng)為ios,android,廣告出價(jià)5塊
  • ad2 定向?yàn)榈赜虺啥荚?8~28歲的健身行業(yè)男性,并且要求適用的操作系統(tǒng)為ios和mac,廣告出價(jià)4.8塊
  • ad3 定向?yàn)樵?8~38歲的男性,并且要求適用的操作系統(tǒng)為android,廣告出價(jià)5.7塊
  • ad4 定向?yàn)樵?8~38歲,并且要求適用的操作系統(tǒng)為ios,廣告出價(jià)5.2塊

1.2 角色對應(yīng)廣告分析

  • 角色1: 北京,女性,健身行業(yè),操作系統(tǒng)ios
  • 角色2: 廣州,男性,18~28歲,旅游行業(yè),操作系統(tǒng)為ios
  • 角色3: 成都,女性,28~38歲,健身行業(yè),操作系統(tǒng)為ios
  • 角色4: 成都,男性,28~38歲,健身行業(yè),操作系統(tǒng)為ios

1.3. 認(rèn)真分析后得出下面每個(gè)角色可以推送的廣告如下

  • 角色1: ad4
  • 角色2: ad1,ad4
  • 角色3: ad4
  • 角色4: ad2,ad4

往往傳統(tǒng)數(shù)據(jù)庫無法滿足上述的查詢時(shí)延, 大廠往往又開發(fā)自己的倒排索引系統(tǒng), 為了減少成本, 可以使用elasticsearch的布爾查詢.

二冀惭、使用elasticsearch 查詢實(shí)時(shí)查詢廣告

2.1. mysql中, 如果要查詢某個(gè)用戶滿足的廣告條件如下可整理為表達(dá)式

[(不存在性別定向)|| (存在性別定向且滿足條件)]
&& [(不存在年齡定向)|| (存在年齡定向且滿足條件)]
&& [(不存在標(biāo)簽定向)|| (存在標(biāo)簽定向且滿足條件)]
&& [(不存在地域定向)|| (存在地域定向且滿足條件)]
&& [(不存在操作系統(tǒng)定向)|| (存在操作系統(tǒng)定向且滿足條件)]

2.2 準(zhǔn)備工具: postman 或者支持curl命令行, 一臺安裝了docker的機(jī)器

2.2.1 拉取es鏡像,并且運(yùn)行起來
docker pull docker.io/elasticsearch:7.1.1
docker run -d --name es1  -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" b0e9f9f047e6
2.2.2 執(zhí)行命令

postman或者命令行中執(zhí)行 curl --location --request GET 'http://192.168.17.77:9200'

如果返回下面的文檔說明你安裝單機(jī)版本的elasticsearch已經(jīng)安裝完成

{
    "name": "cc51cc2a79ce",
    "cluster_name": "docker-cluster",
    "cluster_uuid": "BveCHkuVTtWwr-rcWDmTpg",
    "version": {
        "number": "7.1.1",
        "build_flavor": "default",
        "build_type": "docker",
        "build_hash": "7a013de",
        "build_date": "2019-05-23T14:04:00.380842Z",
        "build_snapshot": false,
        "lucene_version": "8.0.0",
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
}

2.3. 建立廣告索引,查詢廣告位對應(yīng)廣告

通常用戶訪問app拉取廣告是以廣告位為基準(zhǔn), 該廣告位下面有n個(gè)帶有定向條件的廣告.那么 查詢條件就是廣告位id,底價(jià)+以及用戶自身的屬性

創(chuàng)建廣告位id為100的索引

curl --location --request PUT 'http://192.168.17.77:9200/posfor100'

  1. 增加該索引對應(yīng)的數(shù)據(jù)(類型于mysql的行數(shù)據(jù))
北上廣深,成都分別映射為 1,2,3,4,5
男女映射為1,2
操作系統(tǒng)ios, android,mac 映射為1,2,3  
行業(yè)旅游,健身分別映射為 1,2 
年齡18~28 映射為2

插入對應(yīng)的4條數(shù)據(jù),假設(shè)上面4個(gè)廣告對應(yīng)的id為 101,102,103,104

curl --location --request POST 'http://192.168.17.77:9200/posfor100/_doc/101' \
--header 'Content-Type: application/json' \
--data-raw '{"city":[1,2,3,4],"ageRange":[2],"gender":[1],"os":[1,2],"industry":[1,2],"price":5}'
curl --location --request POST 'http://192.168.17.77:9200/posfor100/_doc/102' \
--header 'Content-Type: application/json' \
--data-raw '{"city":[5],"ageRange":[2],"gender":[1],"os":[1,3],"industry":[2],"price":4.8}'
curl --location --request POST 'http://192.168.17.77:9200/posfor100/_doc/103' \
--header 'Content-Type: application/json' \
--data-raw '{"ageRange":[2],"gender":[1],"os":[2],"price":5.7}'
curl --location --request POST 'http://192.168.17.77:9200/posfor100/_doc/104' \
--header 'Content-Type: application/json' \
--data-raw '{"ageRange":[2],"os":[1],"price":5.2}'
  1. 假設(shè)該廣告位100的底價(jià)為3塊錢,使用布爾查詢

角色1 對應(yīng)的查詢

curl --location --request GET 'http://192.168.17.77:9200/posfor100/_search' \
--header 'Content-Type: application/json' \
--data-raw '{"query":{"bool":{"filter":[{"bool":{"should":[{"term":{"gender":{"value":2,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"gender","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"os":{"value":1,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"os","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"city":{"value":1,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"city","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"industry":{"value":2,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"industry","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"ageRange":{"value":2,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"ageRange","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"filter":[{"range":{"price":{"from":3.0,"to":null,"include_lower":true,"include_upper":true,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}}'

得到查詢條件如下, 獲得了id 104的廣告,即是廣告4

{
    "took": 403,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.0,
        "hits": [
            {
                "_index": "posfor100",
                "_type": "_doc",
                "_id": "104",
                "_score": 0.0,
                "_source": {
                    "ageRange": [
                        2
                    ],
                    "os": [
                        1
                    ],
                    "price": 5.2
                }
            }
        ]
    }
}

角色2對應(yīng)的查詢

curl --location --request GET 'http://192.168.17.77:9200/posfor100/_search' \
--header 'Content-Type: application/json' \
--data-raw '{"query":{"bool":{"filter":[{"bool":{"should":[{"term":{"gender":{"value":1,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"gender","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"os":{"value":1,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"os","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"city":{"value":4,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"city","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"industry":{"value":1,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"industry","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"should":[{"term":{"ageRange":{"value":2,"boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"ageRange","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"minimum_should_match":"1","boost":1.0}},{"bool":{"filter":[{"range":{"price":{"from":3.0,"to":null,"include_lower":true,"include_upper":true,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}}'

得到的結(jié)果

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.0,
        "hits": [
            {
                "_index": "posfor100",
                "_type": "_doc",
                "_id": "101",
                "_score": 0.0,
                "_source": {
                    "city": [
                        1,
                        2,
                        3,
                        4
                    ],
                    "ageRange": [
                        2
                    ],
                    "gender": [
                        1
                    ],
                    "os": [
                        1,
                        2
                    ],
                    "industry": [
                        1,
                        2
                    ],
                    "price": 5
                }
            },
            {
                "_index": "posfor100",
                "_type": "_doc",
                "_id": "104",
                "_score": 0.0,
                "_source": {
                    "ageRange": [
                        2
                    ],
                    "os": [
                        1
                    ],
                    "price": 5.2
                }
            }
        ]
    }
}

由上可得角色1獲取到ad4,角色2獲取到ad1,ad4, 和我們最初得到的結(jié)論是一樣的2, 剩余角色3,角色4對應(yīng)的廣告,請各位親自己動手驗(yàn)證.

三幻梯、小結(jié)

  1. 學(xué)習(xí)到定向條件可以通過es的布爾表達(dá)式來檢索

參考如下

  1. 基于布爾表達(dá)式的廣告索引設(shè)計(jì)
  2. Elasticsearch(Es)聚合查詢(指標(biāo)聚合别威、桶聚合)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末若治,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旦装,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊滔,死亡現(xiàn)場離奇詭異阴绢,居然都是意外死亡店乐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門呻袭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眨八,“玉大人,你說我怎么就攤上這事左电×啵” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵篓足,是天一觀的道長段誊。 經(jīng)常有香客問我,道長栈拖,這世上最難降的妖魔是什么连舍? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮涩哟,結(jié)果婚禮上索赏,老公的妹妹穿的比我還像新娘。我一直安慰自己贴彼,他們只是感情好潜腻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著器仗,像睡著了一般融涣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上青灼,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音妓盲,去河邊找鬼杂拨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悯衬,可吹牛的內(nèi)容都是我干的弹沽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼筋粗,長吁一口氣:“原來是場噩夢啊……” “哼策橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娜亿,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丽已,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后买决,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛婴,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吼畏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘁灯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻蚊。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丑婿,靈堂內(nèi)的尸體忽然破棺而出性雄,到底是詐尸還是另有隱情,我是刑警寧澤羹奉,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布秒旋,位于F島的核電站,受9級特大地震影響尘奏,放射性物質(zhì)發(fā)生泄漏滩褥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一炫加、第九天 我趴在偏房一處隱蔽的房頂上張望瑰煎。 院中可真熱鬧,春花似錦俗孝、人聲如沸酒甸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽插勤。三九已至,卻和暖如春革骨,著一層夾襖步出監(jiān)牢的瞬間农尖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工良哲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盛卡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓筑凫,卻偏偏與公主長得像滑沧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子巍实,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容