一尘不染

使用C#客户端Nest进行Elasticsearch中的索引和全文搜索而无需辩证法

elasticsearch

我正在准备一个带有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));

第二个不使用分析器方法,因为在elasticsearch文档中,它说elasticsearch将使用字段上使用的分析器。因此,我认为搜索时无需再次定义它。

我得到的结果是:

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

顺便说一句:

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

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

我无法达到我想要的。我做错了什么?-我应该使用其他过滤器而不是Asciifolding吗?-我应该在带有asciifolding的情况下使用preserveOriginal吗?我不想使用该选项不增加分数。-有什么不同吗?

你能帮我么?

如果您不清楚我要问的是什么,请告诉我,我会尽力使其更清楚。

谢谢。


阅读 441

收藏
2020-06-22

共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"
    }
  }
2020-06-22