使用c#client Nest在没有拨号的elasticsearch中进行索引和全文搜索

时间:2016-05-30 11:50:21

标签: c# elasticsearch 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 ”)
  • Querystring可能包含土耳其语字母(“eşarp”)或不包含(“ esarp ”)
  • Querystring可能有多个单词
  • 应根据查询字符串搜索每个索引字符串字段(全文搜索

现在,我做了什么:

  • 在创建索引时,我还配置了映射并使用了一个名为“sanalyze”的自定义分析器,它使用“小写”和“ asciifolding ”过滤器和标准标记器代替标准分析器。
  • 用于字符串字段映射的自定义分析器。

映射的示例代码:

// 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将使用字段上使用的分析器。所以我认为在搜索时不需要再次定义它。

我得到的结果是:

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

顺便说一句:

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

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

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

你能帮帮我吗?

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

谢谢。

1 个答案:

答案 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"
    }
  }