我正在准备一个带有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吗? - 我应该使用带有asciifolding的preserveOriginal吗?我不想使用那个选项来不用分数。 - 有什么不同的事情吗?
你能帮帮我吗?
如果您认为我不清楚我在问什么,请告诉我,我会尽量让它更清楚。
谢谢。
答案 0 :(得分:1)
使用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"
}
}