在搜索引擎 模糊匹配中怎么实现完全匹配查询

Elasticsearch:在搜索引擎中如何实现完全匹配内容精确匹配查询
本文地址:
http://blog.csdn.net/hereiskxm/article/details/
在有搜索引擎之前,我们查文档常使用顺序匹配。比如要搜索 &我的祖国是花园&,需要在文档中顺序扫描,找到完全匹配的子句。
在有了搜索引擎后,我们对查询语句做的处理就不一样了。我们通常会先分词,然后查找对应的词条索引,最后得到评分由高到低的文档列表。我一度以为没法实现完全匹配了,直到一个硬需求的出现。花了一天时间,把完全匹配用搜索引擎的思维整理出来。
简要描述实现思路,字段按一字一词的形式分词,再利用短语查询来搜索。
ES中,可以实现一字一词的的分词器是NGram。
Ngram分词的官方文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
它其实是一个上下文相连续字符的分词工具,可以看官方文档中的例子。当我们将它
min_gram 和 max_gram 都设为1时,,分词的结果是[&s& , &h& , &i& , &n& , &y& , &k& , &e& , &@& , &1& , &8& , &9& , &.& , &c& , &n& ]。
&pre name=&code& class=&javascript&&/index_name/
&settings&: {
&analysis&: {
&analyzer&: {
&charSplit&: {
&type&: &custom&,
&tokenizer&: &ngram_tokenizer&
&tokenizer&: {
&ngram_tokenizer&: {
&type&: &nGram&,
&min_gram&: &1&,
&max_gram&: &1&,
&token_chars&: [
&punctuation&
以上语句中,构建了一个名为“charSplit”的分析器。它使用一个名为“ngram_tokenizer”的Ngram分词器。
可以用如下语句测试charSplit分析器,可以看到一字一词的效果:
curl -POST http://IP:port/{index_name}/_analyze?pretty&analyzer=charSplit
&测试语句&
把这个分析器在mapping里用起来:
&sender&: {
&type&: &string&,
&store&: &yes&,
&analyzer&: &charSplit&,
&fields&: {
&type&: &string&,
&index&: &not_analyzed&
接下来就可以用match_phrase来实现完全匹配查询。
/{index_name}/{type_name}/_search
&query&: {
&multi_match&: {
&query&: &@&,
&type&: &phrase&, //type指定为phrase
&slop&: 0,
//slop指定每个相邻词之间允许相隔多远。此处设置为0,以实现完全匹配。
&fields&: [
&analyzer&: &charSplit&, //分析器指定为charSplit
&max_expansions&: 1
&highlight&: {
//测试高亮是否正常
&pre_tags&: [
&post_tags&: [
&fragment_size&: 100,
&number_of_fragments&: 2,
&require_field_match&: true,
&fields&: {
&sender&: {}
}phrase查询原始的作用是用来做短语查询,它有一个重要的特点:有顺序。我们利用了它匹配的有序性,限制slop为0,则可实现完全匹配查询。
以上语句返回的结果是:
&took&: 18,
&timed_out&: false,
&_shards&: {
&total&: 9,
&successful&: 9,
&failed&: 0
&total&: 1,
&max_score&: 0.,
&_index&: &index_name&,
&_type&: &type_name&,
&_id&: &AU9OLIGOZN4dLecgyoKp&,
&_score&: 0.,
&_source&: {
&sender&: & &&, 李X &&, 秦X &&, 刘X &&&
&highlight&: {
&sender&: [
& &&b&@&/b&&b&1&/b&&b&8&/b&&b&9&/b&&b&.&/b&&b&c&/b&&b&n&/b&&, 李X &&b&@&/b&&b&1&/b&&b&8&/b&&b&9&/b&&b&.&/b&&b&c&/b&&b&n&/b&&, 秦纯X &&b&@&/b&&b&1&/b&&b&8&/b&&b&9&/b&&b&.&/b&&b&c&/b&&b&n&/b&&, 刘X &&
到此,就实现了完全匹配查询。实际环境中用NGram做一字一词分析器的时候会更细致一些,比如有一些字符需要用stop word过滤掉。这些细节可以根据实际需要在构造分析器时添加filter实现,在此不做赘述。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
在实际应用中,我们需要查询内容要完全匹配其内容.其实很简单.在查询内容前面加上双引号.例如 String q=&\&&+&俄罗斯空军&+&\&&; //q为要查询的数据 QueryStringQueryBuilder queryBuilder = new QueryStringQ ...
页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信息,并且单元格处于编辑模式时显示一个查询图标的按钮,点击该按钮也将显示数据库中所有商品信息. KryptonDataGridView显示控件此处命名为kDGVI ...
精确匹配和最长匹配 一次投标过程中,客户抓住了市场吹嘘的最长匹配技术问个不停,这是我们后来的澄清.看过很多文章后,虽然原理已经清楚了,但我认为这并不能说明哪个技术更好. 最长匹配和精确匹配 本部分要点: 最早的三层交换机因为硬件结构问题,如果使用最长匹配,需要用软件算法支持,这样必然会导致系统性能的大大降低,所以早期的三层交换机使用了精确匹配技术.利用类似C ...
在互联网的海洋中,最重要的就是互联互通,不被其他网站引用的网站就是“信息孤岛”.“酒好也怕巷子深”,也许这话说起来有点像垃圾邮件广告,但事实就是这样.所以如果做网站的目的不是孤芳自赏,就需要积极的推广自己的网站.通过搜索引擎推广自己需要注意以下几个方面 以量取胜:不一定加入大型网站的分类目录才是网站推广,来自其他网站的任何反相链接都是有用的.网站推广比较经典 ...
一.前言 传统的搜索引擎的定义,是指一种对于指定的查询(Query),能够返回与之相关的文档集合(Documents)的系统.而百度将这个定义更加丰富化,即搜索引擎能够帮助人们更方便的找到所求.这里的&所求&,比&文档&更加宽泛和丰富,比如一个关于天气的查询,直接返回一个天气预报的窗口,而非一篇关于天气的文档:再如一个 ...
一.前言 传统的搜索引擎的定义,是指一种对于指定的查询(Query),能够返回与之相关的文档集合(Documents)的系统.而百度将这个定义更加丰富化,即搜索引擎能够帮助人们更方便的找到所求.这里的&所求&,比&文档&更加宽泛和丰富,比如一个关于天气的查询,直接返回一个天气预报的窗口,而非一篇关于天气的文档:再如一个 ...
您已经创建了一个很棒的站点,接下来该做什么呢?无论这个 Web 站点的目的是销售产品还是提供信息,如果没有人浏览它,您的努力就白费了.让站点受到关注的方法是让它对搜索引擎和实际受众友好. 向搜索引擎 &推销& Web 站点本身已经成了一种业务,许多顾问.工具和搜索引擎优化(SEO)站点都可以帮助您的站点吸引搜索引擎的注意.或许现在的信息和 ...
散列(hash)也就是哈希,是信息存储和查询所用的一项基本技术.在搜索引擎中网络爬虫在抓取网页时为了对网页进行有效地排重必须对URL进行散列,这样才能快速地排除已经抓取过的网页.最理想的状态是对联网上所有的网页都分配一个哈希地址,可想而知这是一个相当宠大的数字,但实际上往往是无法做到这一点.虽然google.百度都是采用分布式的机群进行哈希排重,但实际上也 ...

我要回帖

更多关于 搜索引擎实现原理 的文章

 

随机推荐