簡體   English   中英

使用 c# 客戶端 Nest 在沒有辯證法的情況下在彈性搜索中進行索引和全文搜索

[英]indexing and full text searching in elasticsearch without dialitics using c# client Nest

我正在准備一個帶有 elasticsearch 的站點內搜索引擎,我是 elasticsearch 的新手。 將使用該引擎的站點是土耳其語/英語

在土耳其,我們有土耳其語字母,如'ğ', 'ü', 'ş', 'ı', 'ö', 'ç' 但是當我們通常搜索時,我們使用字母'g', 'u', 's', 'i', 'o', 'c' 這不是一條規則,但我們通常會這樣做,像習慣一樣思考,我們曾經這樣做過。

現在,我有一個名為“product”的文檔類型,這個類型有幾個字符串屬性,有些是嵌套的。 例如:

public class Product {
    public string ProductName { get; set; }
    public Category Category { get; set; }
    //...
}
public class Category {
    public string CategoryName { get; set; }
    //...
}

我的目標是這樣的:

  • ProductName 或 Category.CategoryName 可能包含土耳其語字母 (" Eşarp ") 或者有些可能會被錯誤輸入並用英文字母 (" Esarp ")
  • 查詢字符串可能包含土耳其語字母(“ eşarp ”)或不包含(“ esarp ”)
  • 查詢字符串可能有多個詞
  • 每個索引字符串字段都應該針對查詢字符串進行搜索(全文搜索

現在,我做了什么:

  • 在創建索引時,我還配置了映射並使用了一個名為“sanalyze”自定義分析器,它使用“小寫”和“ asciifolding ”過濾器和標准分詞器而不是標准分析器。
  • 將該自定義分析器用於字符串字段映射。

映射示例代碼:

// some more mappings which uses the same mapping for all string fields.
.Map<Yaziylabir.Extensions.TagManagement.Models.TagModel>(m => m.AutoMap().Properties(p => p
    .String(s => s
        .Name(n => n.Tag).Analyzer("sanalyze")))))
.Settings(s => s
    .Analysis(ans => ans
        .Analyzers(anl => anl
            .Custom("sanalyze", c => c
                .Tokenizer("standard")
                .Filters("lowercase", "asciifolding")))));
  • 我刪除、重新創建並索引了我的索引
  • 現在我正在嘗試在該索引中進行搜索。

我嘗試使用兩個不同的查詢來搜索存儲的文檔:

q &= Query<ProductModel>.QueryString(t => t.Query(Keyword).Analyzer("sanalyze"));

q &= Query<ProductModel>.QueryString(t => t.Query(Keyword));

第二個不使用 Analyzer 方法,因為在 elasticsearch 文檔中,它說 elasticsearch 將使用在字段上使用的分析器。 所以我覺得搜索的時候沒必要再定義了。

我得到的結果:

  • 第一個查詢( with Analyzer("sanalyze") ):當我搜索“eşarp”或“esarp”時,沒有結果。 當我搜索“bordo”時,我得到了結果。
  • 第二個查詢(沒有分析器(“sanalyze”) ):當我搜索“eşarp”時,我得到了結果。 當我搜索“esarp”時,沒有結果。 當我搜索“bordo”時,我得到了結果。

順便提一句:

  • 文檔包含“ Eşarp ”作為 ProductName 值,當我檢查elasticsearch時創建了“ esarp ”字段術語。

  • 文檔包含“ Bordo ”作為值和“ bordo ”作為字段術語。

我無法實現我想要的。 我做錯了什么? - 我應該使用另一個過濾器而不是 asciifolding 嗎? - 我應該將preserveOriginal 與asciifolding 一起使用嗎? 我不想使用該選項來不搞砸分數。 - 做點不同的事情?

你能幫我么?

如果你覺得我問的不清楚,請告訴我,我會盡量說得更清楚。

謝謝你。

使用默認設置query_string意味着你在搜索_all領域。 _all字段有自己的分析器 - standard分析器。

您需要指定希望query_string作用於哪個字段:

  "query": {
    "query_string": {
      "query": "your_field_name:esarp"
    }
  }

或者

  "query": {
    "query_string": {
      "query": "esarp",
      "default_field": "your_field_name"
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM