使用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 ”filter和标准标记器代替标准分析器。
  • 使用该自定义分析器进行字符串字段映射。

映射示例代码:

 // some more mappings which uses the same mapping for all string fields. .Map(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.QueryString(t => t.Query(Keyword).Analyzer("sanalyze")); q &= Query.QueryString(t => t.Query(Keyword)); 

第二种方法不使用Analyzer方法,因为在elasticsearch文档中,它表示elasticsearch将使用字段上使用的分析器。 所以我认为在搜索时不需要再次定义它。

我得到的结果是:

  • 第一个查询( 使用Analyzer(“sanalyze”) ):当我搜索“eşarp”或“esarp”时,没有结果。 当我搜索“bordo”时,我得到了结果。
  • 第二个查询( 没有分析器(“sanalyze”) ):当我搜索“eşarp”时,我得到了结果。 当我搜索“esarp”时,没有结果。 当我搜索“bordo”时,我得到了结果。

BTW:

  • 文档包含“ Eşarp ”作为ProductName值,当我检查elasticsearch创建“ esarp ”字段术语时。

  • 文档包含“ Bordo ”作为值,“ bordo ”作为字段术语。

我无法实现我想要的东西。 我做错了什么? – 我应该使用另一个filter而不是asciifolding吗? – 我应该使用带有asciifolding的preserveOriginal吗? 我不想使用那个选项来不用分数。 – 有什么不同的事吗?

你能帮我么?

如果您认为我不清楚我在问什么,请告诉我,我会尽量让它更清楚。

谢谢。

使用_all的默认设置意味着您正在_all字段中搜索。 _all字段有自己的分析器 – standard分析器。

您需要指定query_string在哪个字段上执行操作:

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

要么

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