【问题标题】:Token Chars Mapping to Ngram Filter ElasticSearch NEST令牌字符映射到 Ngram 过滤器 ElasticSearch NEST
【发布时间】:2016-10-30 04:13:54
【问题描述】:

我正在尝试使用 NEST 复制以下映射,并在将令牌字符映射到令牌生成器时遇到问题。

{
   "settings": {
      "analysis": {
         "filter": {
            "nGram_filter": {
               "type": "nGram",
               "min_gram": 2,
               "max_gram": 20,
               "token_chars": [
                  "letter",
                  "digit",
                  "punctuation",
                  "symbol"
               ]
            }
         },
         "analyzer": {
            "nGram_analyzer": {
               "type": "custom",
               "tokenizer": "whitespace",
               "filter": [
                  "lowercase",
                  "asciifolding",
                  "nGram_filter"
               ]
            }
         }
      }
   }

我能够复制除令牌字符部分之外的所有内容。有人可以帮忙吗?下面是我复制上述映射的代码。 (token chars部分除外)

 var nGramFilters1 = new List<string> { "lowercase", "asciifolding", "nGram_filter" };
 var tChars = new List<string> { "letter", "digit", "punctuation", "symbol" };

    var createIndexResponse = client.CreateIndex(defaultIndex, c => c
                 .Settings(st => st
                 .Analysis(an => an
                 .Analyzers(anz => anz
                 .Custom("nGram_analyzer", cc => cc
                 .Tokenizer("whitespace").Filters(nGramFilters1)))
               .TokenFilters(tf=>tf.NGram("nGram_filter",ng=>ng.MinGram(2).MaxGram(20))))));

参考文献

  1. SO Question
  2. GitHub Issue

【问题讨论】:

    标签: elasticsearch nest elasticsearch-net


    【解决方案1】:

    NGram Tokenizer 支持令牌字符 (token_chars),使用这些字符来确定应将哪些字符保留在令牌中,并在列表中未表示的任何内容上进行拆分。

    NGram Token Filter 另一方面,对分词器生成的令牌进行操作,因此只有应该生成的最小和最大克数选项。

    根据您当前的分析链,您可能想要以下内容

    var createIndexResponse = client.CreateIndex(defaultIndex, c => c
        .Settings(st => st
            .Analysis(an => an
                .Analyzers(anz => anz
                    .Custom("ngram_analyzer", cc => cc
                        .Tokenizer("ngram_tokenizer")
                        .Filters(nGramFilters))
                    )
                .Tokenizers(tz => tz
                    .NGram("ngram_tokenizer", td => td
                        .MinGram(2)
                        .MaxGram(20)
                        .TokenChars(
                            TokenChar.Letter,
                            TokenChar.Digit,
                            TokenChar.Punctuation,
                            TokenChar.Symbol
                        )
                    )          
                )
            )
        )
    );
    

    【讨论】:

    • 谢谢拉斯。但是将标记器从 whitespace 更改为 ngram_tokenizer 不会有空格的特征,对吧?相反,我可以添加TokenChar.whitespace??在.Filters(nGramFilters) 中,我定义了一个名为ngram_filter 的自定义过滤器,如我的帖子中所述。我是否仍应将其定义为该部分由标记器处理。
    • token_charsngram_tokenizer 是白名单,因此任何未涵盖的字符都不会包含在令牌中,并将被拆分。因此,根据上述情况,ngram_tokenizer 将在标记化时拆分空格并创建 2 到 20 之间的克。结果将类似于将whitespace 标记器和ngram 过滤器作为过滤器的一部分。跨度>
    • 感谢 Russ 的澄清。
    • 嗨 Russ,对于标题字段上的上述映射样式,当我在标题字段(匹配短语)上搜索 ASN - Functional Specification for IMS v1.2Elasticsearch The Definitive Guide-Ascetic_trip 时,它没有显示任何结果。但是当我搜索 attachmentquiz 关键字时,它显示了相同查询的结果。我的理解是关键字中带有空格的任何内容都返回 0 结果。查询client.Search&lt;Document&gt;(s =&gt; s.Query(q =&gt; q.MatchPhrase(mp =&gt; mp.Field(fi =&gt; fi.Title).Query(keyword))));我该如何解决? TIA
    • 您可以使用_analyze API - elastic.co/guide/en/elasticsearch/reference/current/… 查看分析器为给定输入生成的令牌。这使您可以深入了解在索引时将存储在倒排索引中的标记。现在,对于另一个输入,您可以看到使用相同的分析器生成了哪些令牌。它是否产生与另一个输入相同的标记?这将让您了解特定分析器的功能。
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2023-03-15
    • 2015-12-01
    相关资源
    最近更新 更多