如何在一个文档中快速定位一个关键词
数据量小的情况下可以用字符串匹配
有哪些字符串匹配算法,怎么优化
KMP算法
如何在上亿个文档中快速定位一个关键词
可以用倒排索引
ES分词错误的情况如何处理/es分词导致查询结果不准确
问题的具体描述是:索引里面有数据,却无法查询出来。
1.增加自定义词库,修改es的配置文件IKAnalyzer.cfg.xml,但这种方案无法一次性解决问题,每次遇到此问题时才能将未查询到的词组加入自定义词库且需要重启es,会影响线上功能。
2.不直接使用原文进行查询,而是先将原文通过多个分词器进行分词,再使用分词后的结果进行查询,缺点是如果分词结果太多会比较消耗性能。
ES知识恶补:
一、全文搜索(Full-text search)的工作原理如下:
-文本分析(Text analysis):通过使用stemming、lowercasing、stop word elimination等一系列技巧将文本有序分析成一个便于搜索的格式。Es内置多种分析器和分词器,也可以自定义分析器。
-创建倒排索引(Inverted index creation):完成文本分析后,会得到resulting tokens。Es依据它来构建倒排索引。倒排索引是一种数据结构,将每个令牌映射到包含它的文档。有两个关键组成部分:- 字典(Dictionary):A sorted list of all unique terms(术语) in the collection of documents in your index. - 发布列表(Posting list):For each term, a list of document IDs where the term appears, along with optional metadata like term frequency and position.
-相关性评分(Relevance scoring):每个文档的相关性分数用称为"_score"的正浮点数表示,越高越相关。Es计算相关性评分的默认相似性算法是OkapiBM25,属于TF-IDF算法的变体,基于术语频率、文档频率、文档长度计算相关性分析。[这篇技术博客深入分析了BM25](https://www.elastic.co/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables)
-全文搜索查询(Full-text search query):被查询的文本,其分析方式和索引文本相同,生成的词元用于搜索倒排索引。
二、全文搜索允许使用同义词(synonyms)进行搜索
同义词可以改善搜索体验并扩大搜索结果的范围。
同义词的好处如下:
- 提高搜索相关性
- 用户改善特定领域的词汇的搜索体验
- 用于定义常见拼写错误和打字错误
同义词集合(Synonyms sets)数量无上限,使用同义词集合的方法如下:
- 存储同义词集合数据
- 配置同义词token过滤器和分析器
存储同义词集合的三种方法:
- 同义词API,允许动态定义和修改同义词集合。修改同义词集合后会自动重新加载相关的分析器
- 同义词文件,同义词集合文件需要上传到所有的集群节点中,并位于Es的配置目录中。要更新现有的同义词集合,需要将新文件上传到集群中,同义词集合文件必须在每个集群节点上保持同步。当同义词集合更新时,需要通过重载搜索分析器API刷新搜索分析器。即手动同步和重载。
- 内联,直接在token过滤器定义中添加同义词。警告:生产环境禁止,大量的内联同义词会不必要的增加集群大小,并可能导致性能问题。
配置同义词token过滤器和分析器(在创建同义词集合之后)
- 警告1.同义词集合必须在添加到索引之前存在。如果一个新建的索引,引用了不存在的同义词集合,该索引将保持在部分创建和不可操作的状态。恢复正常的唯一方法是确保同义词集合存在,然后要么删除并重建索引,要么关闭并重新打开索引。
- 警告2.无效的同义词规则会在应用分析器更改时导致错误,阻止可重新加载的分析器重新加载和应用更改。必须纠正同义词规则的错误并重新加载分析器。具有无效同义词规则的索引无法重新打开,导致索引在以下情况无法操作:包含该索引的节点启动时;从关闭状态打开索引时;节点重启时(会重新打开分配给该节点的分片)。