【问题标题】:Elasticsearch + NEST: Use token-filter only for comparisation but not on analyzers resultElasticsearch + NEST:仅将标记过滤器用于比较,但不适用于分析器结果
【发布时间】:2020-02-09 09:56:47
【问题描述】:

我想在 elasticsearch 中构建一个分析器,在比较时忽略其输入的大小写,但返回区分大小写的结果。

这是我的实际状态:

用于创建分析器的我的 NEST 代码

{ "MySynonymFilter", new SynonymTokenFilter { SynonymsPath = "Path/SynonymFile.txt", Lenient = true} },

{
    "MySynonymizer", new CustomAnalyzer
    {
        Tokenizer = "whitespace",
        Filter = new List<string> {"lowercase", "MySynonymFilter"}
    }
},

这是上面创建的分析器的样子:

"Synonymizer": {
    "filter": [
        "lowercase",
        "MySynonymFilter"
     ],
    "type": "custom",
    "tokenizer": "whitespace"
},

我的同义词文件(“路径/同义词文件.txt”):

one, two, three, four => FIVE

这是实际结果和预期结果:

查询示例:

localhost:port/index/_analyze
{
  "analyzer": "MySynonymizer",
  "text":      "Input"
}

实际结果:

Input: "one"              Output: ["five"]
Input: "One tWo THREE"    Output: ["five", "five", "five"]
Input: "one TWO foo"      Output: ["five", "five", "foo"]

去掉小写过滤器后的结果:

Input: "one"              Output: ["FIVE"]
Input: "One tWo THREE"    Output: ["One", "tWo", "THREE"]
Input: "one TWO foo"      Output: ["FIVE", "TWO", "foo"]

想要的结果:

Input: "one"              Output: ["FIVE"]
Input: "One tWo THREE"    Output: ["FIVE", "FIVE", "FIVE"]
Input: "one TWO foo"      Output: ["FIVE", "FIVE", "foo"]

【问题讨论】:

  • 你不能。同义词过滤器使用他之前的任何过滤器来解析同义词文件。
  • 感谢您清理@MichaelIzvekov

标签: c# elasticsearch nest


【解决方案1】:

请注意,Analyze API 会对您的输入文本进行分析并返回 tokens。这些标记是分析器的输出,但它们不是最终输出,我们将使用这些标记来执行实际搜索。


在早期版本的 Elasticsearch 中,使用ignore_case 参数可以实现您想要的:

PUT /test_index
{
    "settings": {
        "index" : {
            "analysis" : {
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "lenient": true,
                        "ignore_case": "true", // <-- deprecated
                        "synonyms" : ["one, two, three => FIVE"]
                    }
                }
            }
        }
    }
}

然后您可以在不使用"lowercase" 令牌过滤器的情况下分析文本:

GET /test_index/_analyze
{
  "tokenizer" : "whitespace",
  "filter" : ["synonym"] ,
  "text" : "One two three" // --> result: "FIVE", "FIVE", "FIVE"
}

所以您的同义词会忽略大小写,并且分析器不会将任何内容转换为小写...但 ignore_case 已被弃用。如果您尝试此代码,您将收到以下消息:

弃用: synonym_graph 过滤器上的 ignore_case 选项已弃用。相反,在过滤器链中插入一个小写过滤器 在 synonym_graph 过滤器之前。

您想要实现的目标不再可能(这很有意义)。如果您的搜索区分大小写,那么您的同义词也区分大小写...如果您想忽略大小写,请使用"lowercase" 令牌过滤器...

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2020-07-17
    • 2019-06-17
    相关资源
    最近更新 更多