2018-11-17 Elasticsearch .NET client 筆記

問題描述

  1. 使用Elasticsearch .NET client 創(chuàng)建ES的實(shí)例,并導(dǎo)入Shapefile數(shù)據(jù)建全文索引和空間索引啡邑。
  2. Shapefile為地址點(diǎn)數(shù)據(jù)贱勃,需要對(duì)指定的字段進(jìn)行全文檢索(分詞、拼音),支持范圍搜索

ES服務(wù)端配置

  1. ES的版本為6.3.0
  2. 采用ik插件進(jìn)行分詞
  3. 采用pinyin插件進(jìn)行拼音模塊
  4. 使用postman測(cè)試
#創(chuàng)建實(shí)例
PUT http://localhost:9200/test_index
{
    "index":{
      "analysis":{
        "analyzer":{
           "ik_pinyin_analyzer":{
            "type":"custom",
            "tokenizer":"ik_smart",
            "filter":"pinyin_filter"
          }
        },
        "filter":{
          "pinyin_filter":{
            "type":"pinyin",
            "keep_first_letter": false
          }
        }
      }   
}
    
}
#返回結(jié)果
//////////////////返回結(jié)果////////////////////////
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "test_index"
}

///////////////////返回結(jié)果//////////////////////
#配置Mapping
PUT http://localhost:9200/test_index/_mapping/test_type
{
  "properties": {
    "testfield":{
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart",
      "fields": {
        "my_pinyin":{
          "type":"text",
          "analyzer": "ik_pinyin_analyzer",
          "search_analyzer": "ik_pinyin_analyzer"
        }
      }
    }
  }
}

#返回結(jié)果
//////////////////返回結(jié)果////////////////////////
{
    "acknowledged": true
}
//////////////////返回結(jié)果////////////////////////
#索引文檔

POST http://localhost:9200/test_index/test_type
{
  "testfield":"今天天氣不錯(cuò)"
}
#返回結(jié)果
//////////////////返回結(jié)果////////////////////////
{
    "_index": "test_index",
    "_type": "test_type",
    "_id": "tjDRIWcBQbCTUJC9qxCs",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}
//////////////////返回結(jié)果////////////////////////
#搜索文檔(中文)
POST http://localhost:9200/test_index/test_type/_search
{
  "query":{
    "match": {
      "testfield": "天氣"
    }
  }
}
#返回結(jié)果
//////////////////返回結(jié)果////////////////////////
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "test_index",
                "_type": "test_type",
                "_id": "tzDYIWcBQbCTUJC9HRBn",
                "_score": 0.2876821,
                "_source": {
                    "testfield": "今天天氣不錯(cuò)"
                }
            }
        ]
    }
}
//////////////////返回結(jié)果////////////////////////


#搜索文檔(拼音)
POST http://localhost:9200/test_index/test_type/_search
{
  "query":{
    "match": {
      "testfield.my_pinyin": "tianqi"
    }
  }
}
#返回結(jié)果
//////////////////返回結(jié)果////////////////////////
{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.68324494,
        "hits": [
            {
                "_index": "test_index",
                "_type": "test_type",
                "_id": "tzDYIWcBQbCTUJC9HRBn",
                "_score": 0.68324494,
                "_source": {
                    "testfield": "今天天氣不錯(cuò)"
                }
            }
        ]
    }
}
//////////////////返回結(jié)果////////////////////////

通過以上測(cè)試贵扰,可以確定ES的服務(wù)端功能可以實(shí)現(xiàn)仇穗,接下來就是使用.NET客戶端進(jìn)行調(diào)用

ES客戶端配置

  1. vs2015 .net 4.6.1
  2. nuget 安裝 Es.net client

首先建立連接,本機(jī)測(cè)試是單機(jī)部署戚绕,所以連接比較簡(jiǎn)單

            var uris = new[] { new Uri("http://localhost:9200") };
            var connectionPool = new SniffingConnectionPool(uris);
            var settings = new ConnectionConfiguration(connectionPool);
            var lowlevelClient = new ElasticLowLevelClient(settings);

ElasticLowLevelClient這個(gè)類里面封裝了各種操作纹坐,只需要構(gòu)建請(qǐng)求體PostData就行。官方給出的方法是利用匿名對(duì)象或者字符串列肢,在構(gòu)造復(fù)雜對(duì)象的時(shí)候單獨(dú)使用可能不夠方便恰画,可以根據(jù)情況自行調(diào)整。例如瓷马,導(dǎo)入的shapefile有多個(gè)字段需要分詞拴还,應(yīng)當(dāng)如何動(dòng)態(tài)生成Mappings,還有在用bulk批量導(dǎo)入的時(shí)候欧聘,文檔應(yīng)該如何轉(zhuǎn)成Postdata的格式片林。

目標(biāo)1 根據(jù)需要分詞的字段和固定的空間位置字段生成請(qǐng)求體

分析如下:層次較多,且有動(dòng)態(tài)生成的內(nèi)容怀骤,使用字符串format的方法比較難控制费封。所以固定屬性名的采用匿名對(duì)象的方式,而屬性名動(dòng)態(tài)生成的部分蒋伦,用Dictionary<string, object>來解決弓摘。

ps C# 中 string.format()的字符串中如果本來有“{}”,需要寫成“{{}}”

 public static object setMapping(List<string> splitFields)
        {
            #region 配置模板
            var pinyin_filter_TEMPLATE = new
            {
                type = "pinyin",
                keep_first_letter = false
            };
            var ik_pinyin_analyzer_TEMPLATE = new
            {
                type = "custom",
                tokenizer = "ik_smart",
                filter = "pinyin_filter"
            };
            var splitField_TEMPLATE = new
            {
                type = "text",
                analyzer = "ik_max_word",
                search_analyzer = "ik_max_word",
                fields = new
                {
                    my_pinyin = new
                    {
                        type = "text",
                        analyzer = "ik_pinyin_analyzer",
                        search_analyzer = "ik_pinyin_analyzer"
                    }
                }
            };
            var shape_TEMPLATE = new
            {
                type = "geo_point"

            };

            var settings = new
            {
                index = new
                {
                    analysis = new
                    {
                        analyzer = new
                        {
                            ik_pinyin_analyzer = ik_pinyin_analyzer_TEMPLATE
                        },
                        filter = new
                        {
                            pinyin_filter = pinyin_filter_TEMPLATE
                        }
                    }
                }
            };
            #endregion

            var propertiesBody = new Dictionary<string, object>();
            // 分詞字段
            foreach (string field in splitFields)
            {
                propertiesBody.Add(field, splitField_TEMPLATE);
            }
            // 空間位置字段
            propertiesBody.Add("shape", shape_TEMPLATE);

            var properties = new
            {
                properties = propertiesBody
            };
            var indexNameTEMPLATE = new Dictionary<string, object>();
            // type "addorpoi" 痕届,可以用變量代替韧献,一般type是自定義的
            indexNameTEMPLATE.Add("addorpoi", properties);

            var mappings = indexNameTEMPLATE;

            var settinMapping = new
            {
                settings = settings,
                mappings = mappings
            };

            return settinMapping;
        }
目標(biāo)2 根據(jù)空間位置和指定間距進(jìn)行地址搜索

分析如下:搜索的請(qǐng)求體固定,只要換參數(shù)即可研叫,也可以使用字符串锤窑,雖然不太簡(jiǎn)潔,但是也是一種思路嚷炉。
原有的查詢字符串

{
"query":{
    "bool":{
        "must":{
            "match_all":{}
            },
        "filter":{
            "geo_distance":{
                "distance":"100m",
                "shape":"30.6321727220001,120.308015149"
            }
            }
        }
    }

}

使用https://www.sojson.com/yasuoyihang.html提供的壓縮轉(zhuǎn)義工具渊啰,獲得一行轉(zhuǎn)義的json字符串,再用文本把{換成{{ 同時(shí)}換成}}申屹,然后把參數(shù)扣掉換成format需要的形式绘证。

var searchStr = string.Format(searchTemplate, "30.6321727220001,120.308015149", "100");
vat postbody = PostData.String(searchStr);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哗讥,隨后出現(xiàn)的幾起案子嚷那,更是在濱河造成了極大的恐慌,老刑警劉巖忌栅,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车酣,死亡現(xiàn)場(chǎng)離奇詭異曲稼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)湖员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門贫悄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娘摔,你說我怎么就攤上這事窄坦。” “怎么了凳寺?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鸭津,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我肠缨,道長(zhǎng)逆趋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任晒奕,我火速辦了婚禮党窜,結(jié)果婚禮上流强,老公的妹妹穿的比我還像新娘句旱。我一直安慰自己争占,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布闷袒。 她就那樣靜靜地躺著坑律,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囊骤。 梳的紋絲不亂的頭發(fā)上晃择,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音淘捡,去河邊找鬼藕各。 笑死池摧,一個(gè)胖子當(dāng)著我的面吹牛焦除,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播作彤,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膘魄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了竭讳?” 一聲冷哼從身側(cè)響起创葡,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绢慢,沒想到半個(gè)月后灿渴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洛波,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年骚露,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹬挤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棘幸,死狀恐怖焰扳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情误续,我是刑警寧澤吨悍,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蹋嵌,受9級(jí)特大地震影響育瓜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栽烂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一爆雹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愕鼓,春花似錦钙态、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至磺送,卻和暖如春驻子,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背估灿。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工崇呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馅袁。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓域慷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汗销。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犹褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,698評(píng)論 0 3
  • 只想知道大家的工作狀態(tài)
    幽默的老黑閱讀 219評(píng)論 0 0
  • 落實(shí)“五化”教學(xué)之反思 本周開展了以“在課堂教學(xué)中如何落實(shí)‘五化’教學(xué)流程”為主題的教學(xué)研討活動(dòng),老師們針對(duì)自己近...
    小亮_f6c6閱讀 181評(píng)論 0 0
  • 要理解static弛针,就必須要先理解另一個(gè)與之相對(duì)的關(guān)鍵字叠骑,很多人可能都還不知道有這個(gè)關(guān)鍵字,那就是auto削茁,其實(shí)...
    螢火蟲的夢(mèng)想閱讀 1,110評(píng)論 0 0