我想在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"]
请注意,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"
令牌过滤器并使用小写字母同义词。
如果要在搜索中使用小写字母标记,那么用大写字母替换是没有意义的。