在过去的几天里,我一直在玩弹性搜索索引和搜索,我将构建我想要的不同查询。我现在的问题是能够构建一个能够将文本与特殊字符匹配的查询,即使我没有在“搜索栏”中输入它们。我举一个例子来轻松解释我的意思。
想象一下,您的索引文档包含一个名为page content
的字段。在此字段中,您可以拥有部分文本,例如
“O carrodoJoãoépreto。” (意味着João的汽车是葡萄牙语的黑色)
我希望能够输入的内容如下:
O carro do joao e preto
仍然能够得到正确的匹配。
到目前为止我尝试过:
我一直在使用elasticsearch(here)文档中提供的匹配词组查询,例如下面的示例:
GET _search
{
"query": {
"match_phrase": {
"page content":
{
"query": "o carro do joao e preto"
}
}
}
}
此查询的结果为我提供了0次点击。鉴于所提供的查询内容与该文档中存储的内容不同,这是完全可以接受的。
我尝试过设置ASCII折叠令牌过滤器(here),但我不知道如何使用它。所以我基本上做的是用这个查询创建一个新的索引:
PUT /newindex '
{
"page content": "O carro do João é preto",
"settings" : {
"analysis" : {
"analyzer" : {
"default" : {
"tokenizer" : "standard",
"filter" : ["standard", "my_ascii_folding"]
}
},
"filter" : {
"my_ascii_folding" : {
"type" : "asciifolding",
"preserve_original" : true
}
}
}
}
}'
然后,如果我尝试使用上面提供的match_phrase查询进行查询,请执行以下操作:
O carro do joao e preto
它应该向我展示我想要的正确结果。但事情是它不适合我。我忘记了什么吗?过去两天我一直在这里没有成功,我觉得这是我缺少的东西。
所以问题:我需要做些什么来获得所需的匹配?
答案 0 :(得分:0)
管理以找到我自己的问题的答案。在创建索引时,我不得不稍微更改分析器。有关此previous answer的详细信息:
我的代码现在:
{
"settings" : {
"analysis" : {
"analyzer" : {
"default" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "asciifolding"]
},
"text" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase"],
"char_filter" : "html_strip"
},
"sortable" : {
"tokenizer" : "keyword",
"filter" : ["lowercase"],
"char_filter" : "html_strip"
}
}
}
}
}