Elasticsearch + NEST:仅将令牌过滤器用于比较,而不用于分析器结果

问题描述 投票:0回答:1

我想在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"
},

我的同义词文件(“ Path / SynonymFile.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"]
c# elasticsearch nest
1个回答
0
投票

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


您想要的东西可以在Elasticsearch的早期版本中实现,就像这样:

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"
}

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

不推荐使用:synonym_graph过滤器上的ignore_case选项已弃用。而是在过滤器链中插入小写过滤器在synonym_graph过滤器之前。

您想要实现的目标不再可行(对我来说很有意义)。如果您的搜索区分大小写,那么您的同义词也区分大小写...

如果要忽略大小写,则使用用户"lowercase"令牌过滤器并使用小写字母同义词。

如果要在搜索中使用小写字母标记,那么用大写字母替换是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.