当前位置: 首页 > 知识库问答 >
问题:

使用c#客户端Nest在elasticsearch中进行索引和全文搜索,无需对话

柳向明
2023-03-14

我正在准备一个带有elasticsearch的站内搜索引擎,我是elasticsearch的新手。将使用此引擎的站点为土耳其语/英语。

在土耳其,我们有像 'ğ', 'ü', 'ş', 'ı', 'ö', 'ç'. 这样的土耳其字母,但是当我们通常搜索时,我们会使用字母“g”、“u”、“s”、“i”、“o”、“c”。这不是一个规则,但我们通常会这样做,像习惯一样思考,这是我们过去习惯的。

现在,我有一个名为“产品”的文档类型,这种类型有几个字符串属性,有些是嵌套的。例如:

public class Product {
    public string ProductName { get; set; }
    public Category Category { get; set; }
    //...
}
public class Category {
    public string CategoryName { get; set; }
    //...
}

我的目标是:

  • 产品名称或类别。类别名称可能包含土耳其语字母(“Eşarp”),或者一些可能被打字错误并用英文字母(“Esarp”)书写

现在,我所做的是:

  • 在创建索引的同时,我还配置了映射,并使用了一个名为“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将使用字段上使用的分析器。所以我认为在搜索时没有必要再次定义它。

结果是:

  • 第一个查询(使用Analyzer(“sanalyd”)):当我搜索“earp”或“esarp”时,没有结果。当我搜索“bordo”时,我得到了结果。
  • 第二个查询(没有分析器(“sanalyzer”):当我搜索“ešarp”时,我得到了结果。当我搜索“esarp”时,没有结果。当我搜索“bordo”时,我得到了结果。

顺便说一句:

>

文档包含“Bordo”作为值,“Bordo”作为字段项。

我无法实现我想要的。我做错了什么我应该使用另一个过滤器而不是asciifolding吗我应该将preserveOriginal与asciifolding一起使用吗?我不想用这个选项来不得分做些不同的事?

你能帮帮我吗?

如果你认为我问的不清楚,请告诉我,我会尽量说得更清楚。

非常感谢。

共有1个答案

潘弘壮
2023-03-14

使用query_string的默认设置意味着您正在_all字段中搜索。_all字段有自己的分析器-标准之一。

您需要指定要对哪个字段执行操作:

  "query": {
    "query_string": {
      "query": "your_field_name:esarp"
    }
  }

  "query": {
    "query_string": {
      "query": "esarp",
      "default_field": "your_field_name"
    }
  }
 类似资料:
  • 问题内容: 我正在准备一个带有Elasticsearch的现场搜索引擎,并且是Elasticsearch的新手。使用此引擎的网站为 土耳其语/英语 。 在土耳其,我们有土耳其字母,例如 “ğ”,“ü”,“ş”,“ı”,“ö”,“ç” 。但是,当我们通常搜索时,我们使用字母 ‘g’,’u’,’s’,’i’,’o’,’c’ 。 这不是规则,但我们通常会这样做,就像习惯一样,这是我们以前习惯的。 现在,

  • 问题内容: 我开始四处寻找搜索引擎,经过一番阅读后,我决定使用ElasticSearch(这是非常了不起的:)),我的项目在C#中,所以我四处寻找客户端并开始使用NEST,一切都很简单,但是我搜索部分有些混乱。 我想搜索 特定类型的 所有字段 ,然后 输入 以下代码: 我看到许多字符串查询搜索已被弃用,并想确保上面的方法是正确的方式(上面未标记为已弃用…)对于一个简单的任务来说也有点长,所以也许有

  • 问题内容: 我有两个具有以下映射的索引(我将简化它们的映射): 1)AccountType映射: 2)ProductType映射: 现在,我有几件事需要弄清楚: 1)首先,有一个索引是一个好主意,在我的情况下是帐户,并且产品是嵌套对象,但是在这里每次我要更新/添加新产品时,我都必须重新索引(更新)整个帐户文件? 2)我的第二个问题是:我想具有搜索功能,因此,如果用户通过在文本框中键入内容进行搜索,

  • 问题内容: 更新以显示工作示例 我正在尝试对ElasticSearch中的用户名集合进行部分搜索。 到处搜索已经为我指明了方向,但是我为正确的实施而感到困惑,但未获得任何结果。 这是我正在从事的项目中剥离的相关代码。 我尝试了不同的组合和搜索类型,但无济于事。 setup.cs Profile.cs 任何提示将不胜感激。 问题答案: 从nGram令牌过滤器上的es文档中了解一下: 注意事项 您需要

  • 问题内容: 我是Elasticsearch新手。 可以说我们有一个这样的类: 我们有2个文档,其名称分别为 “Ayşe” 和 “ Ayse” 。 现在, 我希望能够存储带有重音符号的名称,但是当我搜索时希望能够将不重音符号查询的结果作为重音敏感结果 。 例如:当我搜索 “ Ayse” 或 “Ayşe”时 ,它应同时返回存储的 “Ayşe”和“ Ayse” (带有重音符号)。 现在,当我搜索“ Ay

  • 问题内容: 我创建了这个功能: 该函数在2个索引中查找搜索词。Visual Studio向我显示以下消息: “已弃用。您可以在查询中指定_index以定位特定索引” 但是我该怎么办呢? 问题答案: 由于不建议使用indexs查询,因此它目前仍可以使用,但不推荐使用该警告是可能在将来的主要版本中将其删除。 您可以通过以下方式实现与索引查询相同的功能: 产生以下查询JSON