[英]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; }
//...
}
我的目標是這樣的:
現在,我做了什么:
映射示例代碼:
// 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 將使用在字段上使用的分析器。 所以我覺得搜索的時候沒必要再定義了。
我得到的結果:
順便提一句:
文檔包含“ 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.