如何在一个文档中快速定位一个关键词

数据量小的情况下可以用字符串匹配

有哪些字符串匹配算法,怎么优化

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过滤器和分析器(在创建同义词集合之后)