1.資料類型差異
不同類型的索引方式是不一樣的,導緻查詢結果不一樣;
2.确切值和全文
确切值是确定的,比如foo和Foo不同
全文文本常常被稱為高度結構化資料,而不是非結構化的資料
@為了友善全文文本字段中進行搜尋查詢,ES首先對文本進行分析,然後使用結果建立一個反向索引。
3.反向索引
反向索引inverted index進行快速的全文檢索;
1)首先對每個文檔進行切分為單獨的詞(詞terms,表征tokens);
2)把所有的詞放入列别并排序;表示存在于的文檔。
存在的問題:對于一些詞的單複數或同義詞沒法比對;
解決方式:可以把詞設定為标準的格式:例如可以把大寫統一轉為小寫,複數轉化為單數,同義詞隻取一種等等。
需要注意的是對于搜尋的值也要進行統一标準化
上面這個表征化和标準化的過程叫做分詞。
4.分析
(1)首先表征化一個文本為反向索引單獨的詞term
(2)然後标準化這些詞為标準形式,提高可搜尋性或查全率
分析器analyzer
三個功能:1)字元過濾器:在表征化前過濾字元串,能去除html标記,&轉化為and等
2)分詞器:tokenizer表征化為獨立的詞,譬如ik
3)表征過濾token filters 通過上面兩步得到的每個詞要進行表征過濾,它可以修改詞(大小寫轉化),去除詞(停用詞)或增加詞(同義詞)
内建的分析器:标準分析器:以單詞邊界切分文本,去除大部分标點符号,把詞轉為小寫;
簡單分詞器:非單個字母的文本切分,然後轉為小寫;
空格分析器:根據空格切分文本,不轉化小寫;
語言分析器:譬如english
分析器被使用:索引時文本被分析為反向索引,搜尋時要同樣的分析流程。
1)當查詢全文,将使用相同的分析器來分析字元串;
2)當查詢一個确切值,查詢不分析,但可以自己指定
5.映射
支援的類型:
類型 | 表示的資料類型 |
String | string |
Whole number | byte, short, integer, long |
Floating point | float, double |
Boolean | boolean |
Date | date |
對于string字元串:兩個參數index、analyer
Index:定義字元串以何種方式被索引:
值 | 解釋 |
analyzed | 首先分析這個字元串,然後索引。換言之,以全文形式索引此字段。 |
not_analyzed | 索引這個字段,使之可以被搜尋,但是索引内容和指定值一樣。不分析此字段。 |
no | 不索引這個字段。這個字段不能為搜尋到。 |
Ps:其他類型long、double、date也接受index參數,隻是不能為analyzed
更新映射
可以在映射中增加字段,但不能修改他。
6.複合類型
多值字段:類似{ "tag": [ "search", "nosql" ]},當做值集合
空字段:null被認為空字段
多層對象:
内部對象:采用扁平的方式,例如:
<pre name="code" class="plain">{
"tweet": [elasticsearch, flexible, very],
"user.id": [@johnsmith],
"user.gender": [male],
"user.name.last": [smith]
}
對象陣列
{
"followers": [
{ "age": 35, "name": "Mary White"},
{ "age": 26, "name": "Alex Jones"},
{ "age": 19, "name": "Lisa Smith"}
]
}
會轉化為:
{
"followers.age": [19, 26, 35],
"followers.name": [alex,jones, lisa, smith, mary, white]
}
原有的關聯關系會消失,後續可以嵌套對象解決,待續。
本文出處:http://blog.csdn.net/shan1369678/article/details/51455005