【问题标题】:C# NEST ElasticSearch Default_Search analyzerC# NEST ElasticSearch Default_Search 分析器
【发布时间】:2016-06-16 22:32:47
【问题描述】:

简而言之,我希望能够拥有一个仅用于搜索的分析器。排序应该由默认分析器进行。

通过添加此代码,我可以成功地使搜索按预期工作。当我搜索“be”时,我会找到带有“Bé”的东西。

        var an = new CustomAnalyzer();
        an.Tokenizer = "keyword";
        an.Filter = new List<string>();
        an.Filter.Add("standard");
        an.Filter.Add("lowercase");
        an.Filter.Add("ascii_folding");

        return await CreateIndexAsync(c => c
            .Index(_index)
            .Analysis(a => a.Analyzers(a1 => a1.Add("default", an)))
            .Analysis(a => a.TokenFilters(tf => tf.Add("ascii_folding", new AsciiFoldingTokenFilter { PreserveOriginal = true })))
        );

这导致我的排序也变成了 ascii 折叠。 一种 一种 B等等等等。

在这里阅读,看起来我应该能够将我的分析器应用于仅搜索。 https://www.elastic.co/guide/en/elasticsearch/reference/1.4/analysis-analyzers.html#default-analyzers

“而default_search可以用来配置一个默认的分析器,只在搜索时使用”

如果我正确理解这一点,我应该能够通过更改此行来应用我的分析器来仅搜索。

            .Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))

这完全破坏了分析器。搜索将默认进行,并且不会点击 Bé。有什么想法我在这里做错了吗?

这是我的要求

Request: {
  "from": 0,
  "size": 70,
  "_source": {
    "include": [
      "Name",
    ]
  },
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "_all": {
              "value": "*be*"
            }
          }
        }
      ]
    }
  },
  "filter": {}
}

在 _all 中使用通配符搜索应该没问题吧?

这是一个带有排序的请求。问题是我的结果在这里按 ascii 折叠值排序(如果我使用默认分析器)

    Request: {
  "from": 0,
  "size": 70,
  "sort": [
    {
      "Name": {
        "order": "asc"
      }
    }
  ],
  "_source": {
    "include": [
      "Name"
    ]
  }
}

【问题讨论】:

    标签: c# search elasticsearch default nest


    【解决方案1】:

    如果您总是在 _all 字段上执行搜索,您可以为此设置一个不同的分析器。

    创建两个分析器,一个是标准的,一个是带有 ascii_folding 的。

    var allAnalyzer = new CustomAnalyzer();
    allAnalyzer.Tokenizer = "keyword";
    allAnalyzer.Filter.Add("customasciifolding");
    
    var defAnalyzer= new CustomAnalyzer();
    defAnalyzer.Tokenizer = "keyword";
    defAnalyzer.Filter = new List<string>();
    defAnalyzer.Filter.Add("standard");
    

    使用您的分析器创建索引。

    return await CreateIndexAsync(c => c
                .Index(_index)
                .Analysis(a => a
                    .Analyzers(a1 => a1
                        .Add("default", defAnalyzer)
                        .Add("customAll",allAnalyzer)
                    )
                    .TokenFilters(tf => tf.Add("customasciifolding", new AsciiFoldingTokenFilter { PreserveOriginal = true })
                    )
                )
            );
    

    然后当你映射设置如下

    await _elasticClient.MapAsync<MyClass>(m => m
                .MapFromAttributes()
                .AllField(af => af.Analyzer("customAll"))
            );
    

    【讨论】:

      【解决方案2】:

      据我了解,您需要申请sorting,因为现在您的排序基于_score。 所以你的查询是通过通配符过滤的,然后取决于分数(在哪里找到匹配项以及多久)对结果进行排序

      .Analysis(a => a.Analyzers(a1 => a1.Add("default_search", an)))
      

      您可以这样做,因此您将使用 ascii 过滤器将其设置为默认分析器

      PS。问题更新后。 您应该使用multifield,因此您应该有一个已分析的字段,一个未分析的字段。搜索分析,排序未分析

      【讨论】:

      • 嗯,有道理。我会仔细看看的。编辑:嗯。它仍然没有解释为什么我不能使用“default_search”..无论是否排序,我只希望我的 ascii 应用于搜索:/
      • 其实可以,但是需要打补丁:) 应该是ascii,否则无法正常搜索。没有 ascii A ÅÆ 是完全不同的字母
      • 我尝试添加“default_search”分析器。根据文档,这听起来正是我想要做的。但如果我这样做,它就会忽略折叠。
      • @Evelie 我已经更新了答案。您必须使用多字段
      • elastic.co/guide/en/elasticsearch/reference/1.4/… 看来我可以将分析器应用于仅搜索?我真的必须为此使用多字段吗?我希望我的索引仍然保持默认不变。我唯一想要的是为搜索添加一个分析器,并且只搜索。感谢您抽出宝贵时间帮助我。
      猜你喜欢
      • 2016-11-08
      • 2020-10-24
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多