使用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" } }