elasticsearch - 我们可以将 char_filter 应用于 elasticsearch 中的自定义标记器吗?
问题描述
我在 Elasticsearch 中设置了一个自定义分析器,该分析器使用 edge-ngram 标记器,并且我正在尝试使用过滤器和 char_filters 来优化搜索体验。
我已经指出了出色的工具elyser,它使您能够测试自定义分析器对特定术语的影响,但是当我将自定义分析器与 char_filter(特别是 html_strip)结合使用时,这会引发错误。
我从 elyser 得到的错误是:
非法参数异常','原因':'自定义规范器可能不使用字符过滤器[html_strip]'
我想知道这是否是合法的错误消息,或者它是否代表工具中的错误。
我参考了主要文档,甚至他们的自定义分析器示例在 elyser 中引发错误:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
elyser 中的命令:
elyzer --es "http://localhost:9200" --index my_index --analyzer my_custom_analyzer "Trinity Chapel <h1>[in fact King's Chapel]</h1>"
如果事实证明 elyser 有问题,谁能指出另一种方法来检查我的自定义分析器生成的令牌,以便我可以测试每个过滤器的影响?
我的自定义分析仪看起来有点像我把厨房水槽扔给他们,我想要一种测试和重构的方法:
PUT /objects
{
"settings" : {
"index" : {
"number_of_shards" : "5",
"analysis" : {
"analyzer" : {
"search_autocomplete": {
"type": "custom",
"tokenizer": "standard",
"char_filter" : [
"html_strip"
],
"filter": [
"standard",
"apostrophe",
"lowercase",
"asciifolding",
"english_stop",
"english_stemmer"
]
},
"autocomplete": {
"type": "custom",
"tokenizer": "autocomplete",
"filter": [
"standard",
"lowercase",
"asciifolding",
"english_stop",
"english_stemmer"
]
},
"title_html_strip" : {
"filter" : [
"standard",
"lowercase"
],
"char_filter" : [
"html_strip"
],
"type" : "custom",
"tokenizer" : "standard"
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20,
"token_chars": [
"letter",
"digit"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"english_stemmer": {
"type": "stemmer",
"name": "english"
}
}
}
}
}
}
解决方案
这个错误在 elyzer 中。为了在分析过程的每个步骤中显示标记的状态,elyzer 对每个阶段执行分析查询:首先是 char filters,然后是tokenizer,最后是token filters。
问题在于,在 ES 方面,自从引入了规范化器(以非向后兼容的方式)以来,分析过程发生了变化。他们假设如果请求中没有规范器、分析器和标记器,但要么是令牌过滤器要么是 char_filter,那么分析请求的行为应该像规范器。
在您的情况下, elyzer将首先执行对字符过滤器的请求,html_strip
ES 会认为它与规范器有关,因此您得到的错误html_strip
对规范器无效char_filter
。
因为我非常了解 Elyzer 的开发人员(Doug Turnbull),所以我已经提交了一个错误。我们会看看会发生什么。
推荐阅读
- amazon-web-services - 如何在 Amazon S3 上安全地存储图像
- python - Sqlalchemy 查询以计算值在列中存在的次数
- azure - Azure 恢复服务计划任务继续禁用
- hive - 在 28 PRECEDING 和 1 PRECEDING 之间的天数 -> 正在使用什么数据范围
- ms-access - 访问自定义功能区 (USysRibbons) 上的 PDF 按钮
- python-3.x - 如何使 Python 中的代码更高效,因为该程序会为大型输入数据集提供时间执行错误
- php - 如何让 jQuery 在返回之前等待 Ajax 调用完成
- c++ - 是 reinterpret_cast
(myTypePtr) 假设指向一个数组? - c++ - 如何将零填充的多维数组传递给 C++ 中的函数?
- javascript - React Router DOM 仅在需要时加载组件