首页 > 代码库 > 精确搜索和全文字搜索(exact values vs. full text)

精确搜索和全文字搜索(exact values vs. full text)

ES中的数据可以广义的分为两种类型:精确值和全文值

精确值就是想他们本来的意思一样存储。例如,date或者用户ID,可以作为精确的string类型进行存储,就像一个用户名或邮箱地址一样,精确的值“Foo”和精确值”foo“是不同的,精确值2014和精确值2014-09-15也是不同的。

全文字,也就是和文本数据——常常使用人类语言进行存储,就像是tweet中的texti或邮件的消息体。

full text常常是”未结构化的数据“,这样说有点不合适,自然语言是高度的结构化的。问题是自然语言的标准是复杂的,这使得让计算机正确解析自然语言是很复杂的。例如:

May is fun but June bores me.

这个是指月份呢还是指人呢?

 

精确的数值让查询变得简单。这个决定是二进制的(The decision is binary)——一个数值要么匹配查询,要么不匹配。就像是使用SQL表达式一样简单:

WHERE name    ="John Smith"
  AND user_id
=2
  AND date    
>"2014-09-15"

全文数据搜索是很微妙的,我们不但但是搜素”Does this document match the query“而是”How well does this document match the query?”也就是说document符合我们搜索的层度。

我们很少希望精确匹配这个字段,而是我们希望搜索的条件是包含在字段中。不进如此,我们还希望搜索明白我们的意图,比如:

1:搜索“UK”应该返回有关“United Kingdom”的document。

2:搜索“jump”应该返回符合“jumped”,“jumps”,“jumping”甚至是“leap”。

3:“johnny walker“应该匹配”Johnny Waler“、”johnnie depp“应该匹配”Johnny Deep“

4:fox news hunting”应该返回有关Fox news的hunting,然而“fox hunting news”应该返回有关hunting的news。

为了有利于在全文字段对这些类型的查询 ,ES首先analyzes这些文字,然后使用结果构建一个inverted index,我们会在接下来的两个章节讨论inverted index和analysis。

 

原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_exact_values_vs_full_text.html