ElasticSearch.NET & NEST —— C#的ES驅(qū)動(dòng)使用入門

NEST 基礎(chǔ)使用

1. 建立連接仙辟,創(chuàng)建client

var nodes = new[]
            {
    new Uri("http://localhost:9200")
};

var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool); ;
var client = new ElasticClient(settings);

2.獲取所有索引

var indexs = client.Cat.Indices();

3. 創(chuàng)建一個(gè)索引

  • 可以增加多個(gè)map 之類碍粥,多個(gè)之類相當(dāng)于屬性拼成了一個(gè)大表
  • subClass1 與 subClass2之間如果有重復(fù)名稱的字段器腋,那么先map的會(huì)保留娩缰,后續(xù)的不會(huì)覆蓋前面的同名字段 —— 如下例:先map的Company,后map的Employee,那么生成index的時(shí)候,實(shí)際生成的是Company
    的 字段五芝, 也就是 string 類型的 Name
client.Indices.Create("indexTest1", c => c
    .Map(m => m
        .AutoMap<Company>()
        .AutoMap<Employee>()
    )
);
public abstract class Document
{
    public JoinField Join { get; set; }
}
public class Company : Document
{
    public string Name { get; set; }
    public List<Employee> Employees { get; set; }
}
public class Employee : Document
{
    public int Name { get; set; }
    public int Salary { get; set; }
    public DateTime Birthday { get; set; }
    public bool IsManager { get; set; }
    public List<Employee> Employees { get; set; }
    public TimeSpan Hours { get; set; }
}
image.png

4. 給Es的對象加上對應(yīng)的解析特性

[ElasticsearchType(RelationName = "employee")]
public class Employee
{
    [Text(Name = "first_name", Norms = false, Similarity = "LMDirichlet")]
    public string FirstName { get; set; }

    [Text(Name = "last_name")]
    public string LastName { get; set; }

    [Number(DocValues = false, IgnoreMalformed = true, Coerce = true)]
    public int Salary { get; set; }

    [Date(Format = "MMddyyyy")]
    public DateTime Birthday { get; set; }

    [Boolean(NullValue = false, Store = true)]
    public bool IsManager { get; set; }

    [Nested]
    [PropertyName("empl")]
    public List<Employee> Employees { get; set; }

    [Text(Name = "office_hours")]
    public TimeSpan? OfficeHours { get; set; }

    [Object]
    public List<Skill> Skills { get; set; }
}

public class Skill
{
    [Text]
    public string Name { get; set; }

    [Number(NumberType.Byte, Name = "level")]
    public int Proficiency { get; set; }
}

5. 查詢

  • 最簡單的查詢示例
var qr1 = client.Search<NodeLogSearchEntity>(s => s
                .Index("log.test_mix-2021.01.18")
                .Query(q => q
                    .MatchAll()
                    )
            );
  • 較為復(fù)雜的查詢
var result = client.Search<VendorPriceInfo>(
                s => s
                    .Explain() //參數(shù)可以提供查詢的更多詳情辕万。
                    .FielddataFields(fs => fs //對指定字段進(jìn)行分析
                        .Field(p => p.vendorFullName)
                        .Field(p => p.cbName)
                    )
                    .From(0) //跳過的數(shù)據(jù)個(gè)數(shù)
                    .Size(50) //返回?cái)?shù)據(jù)個(gè)數(shù)
                    .Query(q =>
                        q.Term(p => p.vendorID, 100) // 主要用于精確匹配哪些值枢步,比如數(shù)字,日期渐尿,布爾值或 not_analyzed的字符串(未經(jīng)分析的文本數(shù)據(jù)類型):
                        &&
                        q.Term(p => p.vendorName.Suffix("temp"), "姓名") //用于自定義屬性的查詢 (定義方法查看MappingDemo)
                        &&
                        q.Bool( //bool 查詢
                            b => b
                                .Must(mt => mt //所有分句必須全部匹配醉途,與 AND 相同
                                    .TermRange(p => p.Field(f => f.priceID).GreaterThan("0").LessThan("1"))) //指定范圍查找
                                .Should(sd => sd //至少有一個(gè)分句匹配,與 OR 相同
                                    .Term(p => p.priceID, 32915),
                                    sd => sd.Terms(t => t.Field(fd => fd.priceID).Terms(new[] {10, 20, 30})),//多值
                                    //||
                                    //sd.Term(p => p.priceID, 1001)
                                    //||
                                    //sd.Term(p => p.priceID, 1005)
                                    sd => sd.TermRange(tr => tr.GreaterThan("10").LessThan("12").Field(f => f.vendorPrice))
                                )
                                .MustNot(mn => mn//所有分句都必須不匹配砖茸,與 NOT 相同
                                    .Term(p => p.priceID, 1001)
                                    ,
                                    mn => mn.Bool(
                                        bb=>bb.Must(mt=>mt
                                            .Match(mc=>mc.Field(fd=>fd.carName).Query("至尊"))
                                        ))
                                )
                            )
                    )//查詢條件
                .Sort(st => st.Ascending(asc => asc.vendorPrice))//排序
                .Source(sc => sc.Include(ic => ic
                    .Fields(
                        fd => fd.vendorName,
                        fd => fd.vendorID,
                        fd => fd.priceID,
                        fd => fd.vendorPrice))) //返回特定的字段
               );

二结蟋、Elasticsearch的文本的查詢

es的text數(shù)據(jù)存儲,實(shí)際上插入一條數(shù)據(jù)的時(shí)候渔彰,會(huì)默認(rèn)的分詞,分詞后再倒排索引推正,后面方便查詢恍涂。text在被index的時(shí)候,會(huì)保留一個(gè)它的子字段 text.keyword植榕,改字段是不被分詞的text字段再沧。(ps: map的時(shí)候也可以設(shè)置不分析)

0. 查看一個(gè)text的分析

  • 在kibana里面的devtool里面執(zhí)行即可
POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
標(biāo)準(zhǔn)分詞器分詞

1. 精準(zhǔn)匹配

屬性 查詢之key分詞的查詢json 查詢之key不分詞的查詢json
es中數(shù)據(jù) => 分詞 { "query": { "match": { "key": "value" } } } { "query": { "term": { "key": "value" } } }
es中數(shù)據(jù) => 不分詞 { "query": { "match": { "key.keyword": "value" } } } { "query": { "term": { "key.keyword": "value" } } }

2. 模糊匹配 —— 字符串 Levenshtein distance =》 fuzzy

fuzzy匹配是根據(jù) Levenshtein distance 來判斷是否匹配,一般長度為 0,1,2 太大將不會(huì)匹配尊残,因?yàn)榻Y(jié)果太多了

  • eg: cat,kat,他們就一個(gè)字符不同所以 Levenshtein distance("kat","cat") = 1
屬性 fuzzy的key的查詢json
es中數(shù)據(jù) => 分詞 { "query": { "fuzzy": { "key": { "value": "cat" "fuzziness": "1" } } } }
es中數(shù)據(jù) => 不分詞 { "query": { "fuzzy": { "key.keyword": { "value": "cat" "fuzziness": "1" } } } }

3. 模糊匹配 —— 使用通配符 wildcard 匹配 =》 WildCard

WildCard 匹配 就很像我們SQL里面的like匹配 只不過這里使用 *或者? 來匹配

  • eg: kiy, kity, kimchy 加入要匹配這三個(gè)
屬性 fuzzy的key的查詢json
es中數(shù)據(jù) => 分詞 { "query": { "wildcard": { "key": { "value": "ki*y" } } } }
es中數(shù)據(jù) => 不分詞 { "query": { "wildcard": { "key.keyword": { "value": "ki*y" } } } }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炒瘸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寝衫,更是在濱河造成了極大的恐慌顷扩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘截,死亡現(xiàn)場離奇詭異婶芭,居然都是意外死亡惰赋,警方通過查閱死者的電腦和手機(jī)赁濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枝冀,“玉大人,你說我怎么就攤上這事谷誓』瑁” “怎么了庐镐?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我损拢,道長探橱,這世上最難降的妖魔是什么哗讥? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮决乎,結(jié)果婚禮上构诚,老公的妹妹穿的比我還像新娘范嘱。我一直安慰自己丑蛤,他們只是感情好受裹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砰盐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宫屠,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音古劲,去河邊找鬼。 笑死闷堡,一個(gè)胖子當(dāng)著我的面吹牛疑故,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扫茅,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糟描!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躲履,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤见间,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后工猜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米诉,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年篷帅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了史侣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴泌。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惊橱,靈堂內(nèi)的尸體忽然破棺而出蚪腐,到底是詐尸還是另有隱情,我是刑警寧澤李皇,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布削茁,位于F島的核電站,受9級特大地震影響掉房,放射性物質(zhì)發(fā)生泄漏茧跋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一卓囚、第九天 我趴在偏房一處隱蔽的房頂上張望瘾杭。 院中可真熱鬧,春花似錦哪亿、人聲如沸粥烁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讨阻。三九已至,卻和暖如春篡殷,著一層夾襖步出監(jiān)牢的瞬間钝吮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工板辽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奇瘦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓劲弦,卻偏偏與公主長得像耳标,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子邑跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

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