国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

ElasticSearch NEST筆記

2019-11-17 02:38:23
字體:
來源:轉載
供稿:網(wǎng)友

ElasticSearch NEST筆記

ElasticSearch NEST筆記

1. 什么是ElasticSearch?

ElasticSearch is a powerful open source search and analytics engine that makes data easy to explore.

可以簡單理解成索引加檢索的工具,當然它功能多于此。ElasticSearch分為服務端與客戶端,服務端提供REST API,客戶端使用REST API。

2.怎么安裝Elastic?

  1. 安裝JDK(下載地址)
  2. 安裝ElasticSearch(下載地址)
    1. 解壓,運行/bin/elasticsearch.bat.
    2. 瀏覽器輸入http://localhost:9200/,可以看到如圖:

    3. 安裝成功。
  3. 安裝ElasticSearch – header pluginhttps://github.com/mobz/elasticsearch-head

    文檔中有詳細說明

    完成后,在如下圖的地方找到一個html

  4. 安裝完成~

3. 如何使用NEST客戶端(文檔:http://nest.azurewebsites.net/nest/quick-start.html)

  1. 連接
    1. var node = new Uri("http://localhost:9200/");
    2. var settings = new ConnectionSettings(
    3. node,
    4. defaultIndex: " geopoint-tests "
    5. );
    6. var client = new ElasticClient(settings);
  2. 添加索引
    1. client.CreateIndex("geopoint-tests");

    上面這句代碼是可以不用寫的,因為在調用下面的index方法的時候,如果沒有指定使用哪個index,ElasticSearch會直接使用我們在setting中的defaultIndex,如果沒有,則會自動創(chuàng)建。

    1. client.Index(obj);

    但是如何你需要使用Mapping來調整索引結構,就會需要CreateIndex這個方法。具體的會在下面的Mapping中提到

  3. 添加數(shù)據(jù)
    1. client.Index(obj)
  4. 搜索

    正常來說,搜索的需求一般是我們傳入一個keyWord(和需要搜索的field name),返回符合條件的列表,那么搜索就分為全文搜索和單屬性搜索。顧名思義,全文搜索就是用keyword去匹配所有的屬性,單屬性搜索就是只匹配指定的屬性。

  • 全文搜索:
      1. keyword = String.Format("*{0}*", keyword);
        1. //默認的Operator是Or,當keyword是類似于"One Two"之類的中間有空格的時候,會被當成兩個關鍵詞搜索,然后搜索結果進行or運算
        2. //所以我們需要根據(jù)需求來調整Operator
      2. var searchResults = client.Search<T>(s => s
      3. .Index(index)
      4. .Query(q => q.QueryString(qs => qs.Query(keyword).DefaultOperator(Operator.And)))
      5. );
      6. return searchResults.Documents;

另外由于ES是分詞搜索,所以當我們要用"One"來搜索完整的單詞"JustOne"的時候,就必須在"One"外面添加**,類似于SQL里面的%keyword%,但是這樣的做法會導致在用完整的單詞來搜索的時候搜索不到結果,所以我們需要使用下面的方式(如果有更好的方法請不吝賜教):

      1. wholeKeyword = keyword;
      2. keyword = String.Format("*{0}*", keyword);
      3. QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
      4. if(!String.IsNullOrEmpty(wholeKeyword)){
      5. QueryContainer wholeWordQuery = new QueryStringQuery() { Query = wholeKeyword };
      6. query = query || wholeWordQuery;
      7. }
      8. var searchResults = client.Search<Person>(s => s
      9. .Index("zhixiao-application")
      10. .Query(query)
      11. );
  • 指定屬性搜索

    指定屬性的搜索有兩種:

  1. 使用term Query
     QueryContainer query2 = new TermQuery { Field = item.Key, Value = item.Value.ToLower() };

Term是一個被索引的精確值,也就是說Foo, foo, FOO是不相等的,因此

在使用term query的時候要注意,term query在搜索的Field已經(jīng)被索引的時候,是不支持大寫的。下面為elasticSearch - header測試

所有數(shù)據(jù):

大寫搜索:

小寫搜索:

NEST的使用:

      1. var searchResults = client.Search<Person>(s => s
      2. .Index("zhixiao-application")
      3. .Query(q => q.Term(t => t.OnField(f => f.Lastname == "keyword")))
      4. );

        或者(效果一樣):

      5. QueryContainer termQuery = new TermQuery { Field = "lastname", Value = "keyword" };
      6. var searchResults = client.Search<Person>(s => s
      7. .Index("zhixiao-application")
      8. .Query(termQuery)
      9. );

PS:term query的Field是必須的,如果Field為空,會產(chǎn)生下面的錯誤           

2.使用 Query String query

QueryString query一般用于全文搜索,但是也可以用于單個屬性的搜索(設置DefaultField屬性),queryString query可以不區(qū)分大小寫。QueryString還有一個好處就是我們可以搜索一個term中的一部分,例如lastname為"t Boterhuis 1",那么我們可以用"terhuis"搜索到這個數(shù)據(jù)(雖然需要在外面包上**),在term query里面就做不到,因為ES把每一個屬性的值都分析成一個個單獨的term,提高了搜索的效率。

下面為elasticSearch - header測試:

完整term搜索(大寫):

完整term搜索(小寫):

部分搜索(大寫,不帶**):

部分搜索(大寫,帶**):

部分搜索(小寫,帶**):

多詞語搜索:當我們想搜索類似于:"t Boterhuis 2"這樣的多個單詞構成的keyword(用空格分開),term query是無法查詢的,term query顧名思義就是單詞查詢。不能支持多單詞查詢

QueryString query:

大家可以看到,第三條也被搜索進來了,這是因為ES把"t Boterhuis 2"解析成了三個詞匯"t"" Boterhuis""2"。然后分開搜索,把結果集合并,所以ID為4的記錄也被搜索出來了。那么我們如何讓合起來搜索呢?

      1. string keyword = "t Boterhuis 2";
      2. QueryContainer wholeWordQuery = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.And };
      3. var searchResults = client.Search<Person>(s => s
      4. .Index("zhixiao-application")
      5. .Query(wholeWordQuery)
      6. );

QueryString query有一個DefaultOperator的屬性,我們可以將其設置為And,這樣搜索的時候,ES會將幾個term的search結果做and運算。

但是有一個比較大的問題是如果我的keyword是"Aberdeen Boterhuis",

這樣也可以搜索出結果來:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 民丰县| 千阳县| 察隅县| 曲水县| 定兴县| 西贡区| 武隆县| 玉山县| 榕江县| 巴彦淖尔市| 扶沟县| 麟游县| 汶川县| 平舆县| 凤阳县| 南溪县| 浦北县| 嵊泗县| 夏津县| 怀来县| 新乡市| 康保县| 神农架林区| 卢湾区| 吴堡县| 柳河县| 漳州市| 定陶县| 池州市| 绥阳县| 昔阳县| 蒲江县| 衡阳县| 金溪县| 武安市| 石家庄市| 白河县| 固原市| 龙岩市| 云梦县| 平阴县|