我正在准备一个带有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));
第二个不使用分析器方法,因为在elasticsearch文档中,它说elasticsearch将使用字段上使用的分析器。因此,我认为搜索时无需再次定义它。
我得到的结果是:
顺便说一句:
文档包含“ Eşarp ”作为ProductName值,当我检查 elasticsearch 时创建了“ esarp ”字段术语。
文档包含“ Bordo ”作为值和“ bordo ”作为字段术语。
我无法达到我想要的。我做错了什么?-我应该使用其他过滤器而不是Asciifolding吗?-我应该在带有asciifolding的情况下使用preserveOriginal吗?我不想使用该选项不增加分数。-有什么不同吗?
你能帮我么?
如果您不清楚我要问的是什么,请告诉我,我会尽力使其更清楚。
谢谢。
使用默认设置query_string表示您正在该_all字段中搜索。该_all领域有自己的分析仪- standard一个。
query_string
_all
standard
您需要指定要在哪个字段query_string上执行操作:
"query": { "query_string": { "query": "your_field_name:esarp" } }
要么
"query": { "query_string": { "query": "esarp", "default_field": "your_field_name" } }