当前位置: 首页 > 面试题库 >

如何在NEST中使用多个索引分析器?

万俟经纶
2023-03-14
问题内容

我有一个已创建的公司类型。在该公司类型的内部,我有一个名为“摘要”的字段。如何在此字段中添加多个索引分析器?

我简要地研究了使用Yakaz插件,但似乎无法与NEST一起使用。

其背后的原因是,有时用户会在查询中搜索带有句点的公司名称,而其他时候则不包括句点。我想在公司名称上使用ngram进行部分匹配,带标点和不带标点。我目前正在使用停用词过滤器来删除标点符号。

摘要字段的属性(具有多个索引分析器将引发错误):

[ElasticProperty(IndexAnalyzer = "partial_match", IndexAnalyzer = "partial_match_no_punctuation", SearchAnalyzer = "full_match")]
public string Summary { get; set; }

对应:

private static void CreateMapping(ElasticClient client)
{
    var partialMatchNoPunctuation = new CustomAnalyzer
    {
        Filter = new List<string> { "standard", "lowercase", "asciifolding", "punctuation_filter", "name_ngrams" },  //Apply all filters before ngram
        Tokenizer = "standard"
    };
    var partialMatch = new CustomAnalyzer
    {
        Filter = new List<string> { "standard", "lowercase", "asciifolding", "name_ngrams" },  //Apply all filters before ngram
        Tokenizer = "standard"
    };

    var fullMatch = new CustomAnalyzer
    {
        Filter = new List<string> { "standard", "lowercase", "asciifolding" },
        Tokenizer = "standard"
    };

    client.CreateIndex(Settings.Default.IndexName, c => c
        .Analysis(descriptor => descriptor
            .TokenFilters(bases => bases
                .Add("name_ngrams", new NgramTokenFilter
                {
                    MaxGram = 11,
                    MinGram = 3
                })
                .Add("punctuation_filter", new StopTokenFilter
                {
                    Stopwords = new List<string> {"."}
                })
                )
            .Analyzers(bases => bases
                .Add("partial_match", partialMatch)
                .Add("partial_match_no_punctuation", partialMatchNoPunctuation)
                .Add("full_match", fullMatch))
        )
    );
}

另外,如果有一种方法可以在单个分析仪中执行此操作,则可以提出建议。

编辑:

我的班级名称是“ ElasticSearchProject”。我希望将其存储为名为“
Project”的类型。我相信我的尝试是导致错误的原因。当我获得Project类型的映射时,它只应用了部分匹配分析器。

这是唯一仍应用于我的班级的ES属性:

[ElasticType(Name = "Project")]

多字段映射:

.AddMapping<ElasticSearchProject>(m => m
    .MapFromAttributes()
    .Properties(project=>project
        .MultiField(mf=>mf
            .Name("Project")
            .Fields(f=>f
                .Number(s=>s.Name(o=>o.Id).Index(NonStringIndexOption.no))
                .String(s => s.Name(o => o.Summary).IndexAnalyzer("partial_match"))
                .String(s => s.Name(o => o.Summary).IndexAnalyzer("partial_match_no_punctuation"))
            ))))

问题答案:

首先,要回答您的问题,您不能将多个分析仪添加到一个字段中。但是,您可以使用多字段类型来映射同一字段的多个版本,并对每个版本应用不同的分析器。

关于带标点和不带标点的搜索,如果您使用与索引和搜索分析器相同的分析器,则没有关系,因为在索引编制过程中应用于字段的相同分析也将应用于用户查询。

例:

Foo.Bar将被索引为foobar

如果用户搜索Foo.BarFooBar,则搜索分析器会将其转换为foobar,因为字段也被索引为,所以将找到匹配项foobar

我觉得你的问题的一部分是,你要使用full_match的搜索分析,并partial_match_no_punctuationpartial_match作为指数分析。尝试将它们调和为一个(删除标点符号,ngram),并将其用于搜索和索引分析器。如果发现仍然需要多个分析器,请查看我上面提到的多字段类型。

希望能有所帮助。

编辑:根据您的更新,多字段映射的问题是您试图为两个字段分配相同的名称。此外,您正在命名字段“项目”,这是您的类型的名称,可能您想将其命名为“摘要”。另外,您也不想将“
Id”字段包含在“ Summary”多字段中。尝试以下方法:

.AddMapping<ElasticSearchProject>(m => m
.MapFromAttributes()
.Properties(project => project
    .MultiField(mf => mf
        .Name(o => o.Summary)
        .Fields(f => f
            .String(s => s.Name(o => o.Summary).Analyzer("partial_match"))
            .String(s => s.Name(o => o.Summary.Suffix("no_punctuation")).Analyzer("partial_match_no_punctuation"))
        )))));

这将在映射中创建两个字段:

summarypartial_match分析仪。

summary.no_puncuationpartial_match_no_punctuation分析仪。



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

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

  • 问题内容: 我正在构建一个API应用程序,该应用程序实质上允许用户构建一个文档,该文档可以按他们想要的方式进行结构化,并将存储在Elasticsearch中。本质上,我为用户提供了一个简单的界面来访问我们的Elasticsearch实例。我试图使实现尽可能简单。到目前为止,这是我要处理的内容。 预期主体的对象: 简单实施: 这可以正常工作,但它在源中包含索引,类型和ID。我真正想做的只是在建立索引

  • 问题内容: 我是ElasticSearch的新手。我正在尝试为索引重新索引以便对其重命名。我正在使用NEST API v5.4。我看到了这个例子: 资料来源 :http : //thomasardal.com/elasticsearch-migrations-with-c-and- nest/ 但是,我无法使用NEST 5.4重现此内容。我认为这是2.4版。我检查ElasticSearch的重大更

  • 我有一个AWS DynamoDb购物车表,其项目结构如下- - 该表将作为主键, 作为索引或GSI, 作为索引或GSI。 我希望能够查询购物车表, 查找的项目。 我不知道这是否意味着查询- 我知道AWS DynamoDb表不能同时使用多个索引进行查询, 我遇到了以下问题,它有一个类似的用例,答案是建议创建一个复合键, 使用多个本地辅助索引DynamoDb进行查询 这是否意味着在将新项放入表中时,

  • 我正在尝试使用NEST c#客户端搜索我的弹性搜索嵌套对象。我的索引名称是”,我的”字段。 这是我的班级: 现在我的web应用程序看起来像这样: 这里是我需要搜索的单词。 我在浏览器的搜索框(网络表单)中输入它。 搜索关键字可能包含任何需要与我的表人员中的任何字段的值匹配。 如果搜索关键字与嵌套文档匹配,则应返回确切的嵌套文档。 我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行