Elasticsearch(搜索(2)--基本的工具)

来源:互联网 发布:免费电子期刊制作软件 编辑:程序博客网 时间:2024/06/10 16:31

确切值(Exact values)vs全文文本(Full text)

Elasticsearch中的数据可以大致分为两种类型:
确切值及全文文本。
确切值是确定的,正如它的名字一样。比如一个date或用户ID,也可以包含更多的字符串比如username或email地址。
确切值“foo”和“foo”就并不相同。确切值2014和2014-09-15也不相同。
全文文本,从另一个角度来说是文本化的数据(常常以人类的语言熟悉书写),比如一片推文(Twitter的文章)或邮件正文。
全文文本常常被称为非结构化数据,其实是一种用词不当的称谓,实际上自然语言是高度结构化的。
问题是自然语言的语法规则是如此的复杂,计算机难以正确解析。例如这个句子:
May is fun but june bores me
到底是说的月份还是人呢?
确切值是很容易查询的,因为结果是二进制--要么匹配,要么不匹配。下面的查询很容易以SQL表达:
WHERE name = "John Smith"
    AND user_id = 2
    AND date > "2014-09-15"
而对于全文数据的查询来说,却有些微妙。我们不会去询问这篇文档是否匹配查询要求?但是,我们会询问这篇文档和查询的匹配程度如何?换句话说,对于查询条件,这篇文档的相关性有多高?
我们很少确切的匹配整个全文文本。我们想在全文中包含查询文本的部分。不仅如此,我们还期望搜索引擎能理解我们的意图:
.一个针对“UK”的查询将返回涉及“United Kingdom”的文档
.一个针对“jump”的查询同时能够匹配“jumped”,“jumps”,“jumping”甚至“leap”
.“johnny walker”也能匹配“Johnnie Walker”,“johnnie depp”及“Johnny Depp”

.“fox news hunting”能返回有关hunting on Fox News的故事,而“fox hunting news”也能返回关于fox hunting的新闻故事。
为了方便在全文文本字段进行这些类型的查询,Elasticsearch首先对文本分析(analyzes),然后使用结果建立一个倒排索引。

倒排索引

Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的文字组成
例如,我们有两个文档,每个文档content字段包含:
1.The quick brown fox jumped overlazy dog
2.Quick brown foxes leap lazy dogs in summer
为了创建倒排索引,我们首先切分每个文档的content字段为单独的单词(我们把它们叫做词(terms)或者表征(tokens)),把所有的唯一词放入列表并排序,结果是这个样子:



现在,如果我们想搜索“quick brown”,我们只需要找到每个词在哪个文档中出现即可:



两个文档都匹配,但是第一个比第二个有更多的匹配项。如果我们加入简单的相似度算法(similarity algorithm),计算匹配单词的数目,这样我们就可以说第一个文档比第二个匹配度更高------对于我们的查询具有更多相关性。
但是在我们的倒排索引中还有些问题:
1.“Quick”和“quick”被认为是不同的单词,但是用户可能认为它们是相同的。
2.“fox”和“foxes”很相似,就像“dog”和“dogs”----它们都是同根词
3.“jumped”和“leap”不是同根词,但意思相似---它们是同义词。

上面的索引中,搜索“+Quick +fox”不会匹配任何文档(记住,前缀+表示单词必须匹配到)。只有“Quick”和“fox”都在同一文档中才可以匹配查询,但是第一个文档包含“quick fox”且第二个文档包含“Quick foxes”。(说白了就是单复数和同义词没法匹配)

用户可以合理的希望两个文档都能匹配查询,我们也可以做的更好。
如果我们将词为统一的标准格式,这样就可以找到不是确切匹配查询,但是足以相似从而可以关联的文档。例如:
1.“Quick”可以转为小写成为"quick"。
2.“foxes”可以被转为根形式“fox”。同理“dogs”可以被转为“dog”。
3.“jumped”和“leap”同义就可以只索引为单个词“jump”

现在的索引:


但我们还未成功。我们的搜索“+Quick +fox”依旧失败,因为“quick”的确切值已经不在索引里,不过,如果我们使用相同的表准化规则处理查询字符串content字段,查询将变成"+quick +fox",这样就能匹配到两个文档。







 
原创粉丝点击