通过上篇文章的介绍后,已经了解elasticSearch可以作为搜索引擎, 提供快速的搜索能力。为什么elasticSearch具有这种能力呢?
因为内部使用了索引。接下来,这篇文章将对索引进行介绍。
首先要介绍的是index analysis module,索引分析模块,它用于注册分析器。
分析器将String field转化为多个分词,然后添加到反向索引中,以便进行文档搜索。
分析器是如何构成的?
字符过滤器 | 接收原始文本并视为字符流,通过添加、删除、改变字符的方式对字符流进行转换。 | 一个分析器可以有多个字符过滤器。 |
分词器 | 接收字符流,进行分词,输出分词流。例如空格分词器,利用空格对文本进行分词。 记录每个分词的顺序、位置,原始词的首尾偏移量。 | 一个分析器只有一个分词器。 |
分词过滤器 | 接收分词流,对分词进行添加、删除、修改。例如小写分词过滤器、连接词分词过滤器。 | 一个分析器可有多个分词过滤器 |
如何支持文本field进行全文搜索呢?
这就需要text analysis了。文本分析作用在于对非结构化的文本进行结构化转换,以便es进行全文
搜索,返回相关性结果,而不是绝对匹配的结果。
何时需要进行text analysis?
索引内有text field且需要进行文本搜索。
文本分析发生在什么情况呢?
文本分析发生在两个地方:
这两种情况称为index and search analysis。
一般情况下,创建索引时和全文搜索时使用同一个分析器,确保进行分词匹配前使用同一套分析规则。
可以自定义分析器吗?
es提供了内置的分析器、字符过滤器、分词器、分词过滤器,同时支持自定义这些组件。
自定义分析器涉及的配置项:
type | 内置的分析器类型或自定义custom | Built-in analyzer reference | Elasticsearch Guide [7.15] | Elastic |
tokenizer | 内置或自定义的分词器 | Tokenizer reference | Elasticsearch Guide [7.15] | Elastic |
char_filter | 内置或自定义字符过滤器组成的数组 | Character filters reference | Elasticsearch Guide [7.15] | Elastic |
filter | 内置或自定义分词过滤器组成的数组 |
举例说明
// 使用内置组件
{"settings": {"analysis": {"analyzer": {
// 自定义分析器名字"my_custom_analyzer": {
// 自定义分析器的组件配置"type": "custom", "tokenizer": "standard","char_filter": ["html_strip"],"filter": ["lowercase","asciifolding"]}}}}
}// 自定义组件
{"settings": {"analysis": {"analyzer": {
// 自定义分析器名字"my_custom_analyzer": { "char_filter": ["emoticons"],"tokenizer": "punctuation","filter": ["lowercase","english_stop"]}},"tokenizer": {
// 自定义分词器名称"punctuation": { "type": "pattern","pattern": "[ .,!?]"}},"char_filter": {
// 自定义字符过滤器名称"emoticons": { "type": "mapping","mappings": [":) => _happy_",":( => _sad_"]}},"filter": {
// 自定义分词过滤器名称"english_stop": { "type": "stop","stopwords": "_english_"}}}}
}
如何更好的支持中文场景呢?
有一个问题,需要搜索的文本时中文时,内置分析器的表现不符合预期,分词效果不好。需要引入支持中文的分析器elasticsearch-analysis-ik。
本文发布于:2024-01-29 03:12:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646916212283.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |