表示索引中的不同類型,例如用戶,產品等。
代表單詞詞幹,整個索引獨有。 (例如,運行是運行,跑步者,運行等單詞的詞幹)。計算逆文檔頻率並將其存儲在單詞上,以提供跨索引範圍的IDF,可用於針對索引執行無模式的搜索。
一個術語表示特定模式中的單詞存在。也就是說,如果詞幹單詞“ run”出現在用戶模式中,並且它也出現在產品架構中,則該架構中將有兩個術語記錄。術語還存儲了一個反向文檔頻率,以提供特定模式的IDF,該IDF允許針對特定模式進行搜索(這些搜索不會受單詞範圍範圍的IDF值的影響)。
列是模式中的可用字段。該列存儲了有關其代表的數據是否存儲的規則,是否索引和重量,可用於優先考慮查詢中的列(例如,產品標題可能比描述的權重更多)
文檔代表索引中的實際實體,這是實際索引的項目,將構成結果的基礎。
字段是與列匹配的文檔的屬性。列,文檔和字段的作用就像典型的數據庫。列就像表列,文檔就像一行或記錄,字段是單元格或條目。
出現表示文檔中字段中的術語(架構特定單詞)的存在。出現是術語和字段的獨特表示。在側面發生的情況下,我們還存儲了一個頻率,該頻率表示該術語出現在字段中的次數(用於稍後在搜索時計算得分)。
位置表示字段中術語的實際位置。如果“ run”(或其詞幹)在一個字段中出現3次,則將有3個位置記錄,每個位置記錄都標記了相應字段中發生的位置。
想像一下,我們的索引中有一個“用戶”模式。該模式為每個用戶實例,“名稱”和“關於”定義了2列。每列既存儲又索引,它們的權重為1。我們有2個用戶可以添加到索引中,[鍵:1,名稱:“ joe bloggs”,“關於”:“ Joe Like jane”]和[key:2,name:“ name:“ jane doe”,jane doe',of:“ jane doe”,on of town of party party party party party party']。我們最終將以以下結構:
| ID | 姓名 |
|---|---|
| 1 | 用戶 |
| ID | 姓名 | 存儲 | 索引 | 重量 |
|---|---|---|---|---|
| 1 | 姓名 | 1 | 1 | 1 |
| 2 | 關於 | 1 | 1 | 1 |
| ID | 單詞 |
|---|---|
| 1 | 喬 |
| 2 | 部落格 |
| 3 | 喜歡 |
| 4 | 簡 |
| 5 | 母鹿 |
| 6 | 愛 |
| 7 | 到 |
| 8 | 派對 |
| ID | schema_id | word_id | document_count |
|---|---|---|---|
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 1 |
| 3 | 1 | 3 | 2 |
| 4 | 1 | 4 | 3 |
| 5 | 1 | 5 | 1 |
| 6 | 1 | 6 | 1 |
| 7 | 1 | 7 | 1 |
| 8 | 1 | 8 | 1 |
| ID | schema_id | 鑰匙 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| ID | document_id | column_id | 價值 |
|---|---|---|---|
| 1 | 1 | 1 | Joe Bloggs |
| 2 | 1 | 2 | 喬喜歡簡 |
| 3 | 2 | 1 | 簡 |
| 4 | 2 | 2 | 簡喜歡參加聚會 |
| ID | field_id | term_id | 頻率 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 1 |
| 3 | 2 | 1 | 1 |
| 4 | 2 | 3 | 1 |
| 5 | 2 | 4 | 1 |
| 6 | 3 | 4 | 1 |
| 7 | 3 | 5 | 1 |
| 8 | 4 | 4 | 1 |
| 9 | 4 | 3 | 1 |
| 10 | 4 | 7 | 1 |
| 11 | 4 | 8 | 1 |
| ID | 出現_id | 位置 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 4 | 2 |
| 5 | 5 | 3 |
| 6 | 6 | 1 |
| 7 | 7 | 2 |
| 8 | 8 | 1 |
| 9 | 9 | 2 |
| 10 | 10 | 3 |
| 11 | 11 | 4 |
創建Blixt對象時,它最初將所有存儲的架構和列對象加載到內存中,如果有的話。這允許Blixt快速查找模式及其關聯的列以驗證索引請求,并快速收集is_indexed並在每個列上收集is_stored約束。
在可以進行文檔索引之前,必須使用一組列定義架構,每個列都有自己的屬性,這些屬性指定是否應存儲它們代表的字段。如果已經存在模式,則可以跳過此部分。如果未提供模式定義,並且不存在此類架構,則會引發例外。
以可索引文檔的形式提供了文檔,指定了一個鍵,客戶系統可以用來以後識別它。可索引的文檔包含一組字段。提供了與文檔一起提供的模式(或類型),以便Blixt能夠將文檔放入索引中的正確模式中。
Blixt首先檢查文檔開始處理該文檔,以確保該模式下的索引中尚不存在。如果確實存在,則會拋出一個例外。
然後,Blixt將添加文檔記錄並開始處理文檔字段。每個字段都被分為令牌(在大多數情況下,令牌是一個單詞),然後每個令牌被莖(即找到單詞的詞根,例如使用英語/搬運工stemmer,“ run”一詞是單詞“運行”,“ runner”,“ runner”,“ runs”等)。
然後,如果沒有相應的記錄,則為每個令牌添加單詞記錄,然後在模式下在架構下創建術語記錄。文檔計數總數的總數已更新,以反映新文檔的添加。
為每個唯一項和字段組合創建出現記錄,表明指定的術語發生在特定字段中。頻率(該術語中發生的術語數量)在發生記錄的側面存儲。在每個發生記錄的記錄中,位置數據也存儲,該記錄代表了一個項的字段中的每個位置。
支持以下查詢類型:
+直接使用該術語(and)或~ ,否則該短語中的所有術語均被視為可選(或),該術語使該術語從考慮(非)中刪除文檔。這種類型的查詢構成了所有其他查詢的基礎。搜索首先將搜索短語分成單獨的單詞(令牌化),然後將每個單詞變成其根部形式(stemming)。然後查詢索引以查找與術語匹配的單詞記錄。使用我們正在詢問的單詞記錄和架構,然後提取術語記錄。如果在術語記錄中不存在任何附上+運算符的搜索詞,則返回一個空結果集。
然後執行查詢以查找包含查詢條款的字段(無論操作員如何),並返回與這些字段相關聯的文檔(並返回其字段,出現和位置,均應相應地加載)。然後,分析每個文檔並接受或拒絕,如果文檔不包含所需的術語( + )或包含刪除項( ~ ),則拒絕了所有其他文檔。然後將一組接受的文檔作為結果返回。
稍後將支持以下查詢類型:
單個術語查詢:類似於多任期查詢,文檔是根據單個項對文檔進行評分的。
完整短語查詢:類似於多期查詢,但僅允許以正確順序包含每個學期的文檔。
它還旨在實現查詢解析,以便在執行搜索之前可以將輸入搜索字符串轉換為正確的查詢類型。
這些是旨在未來的改進。
我們可以用來提高搜索性能,以實現存儲不可知的緩存(redis,memcached,文件系統等)。該項目中有許多用於緩存的用例:
注意:要實現上述某些功能,我們可能需要使用唯一的會話標識符來傳遞並從用戶接收,以確保緩存搜索僅對該用戶有效,並阻止清除這些緩存的對象。當緩存一組搜索結果以允許用戶分頁時,絕對是這種情況。這也可能是值得的緩存版本,這些版本不被認為是特定於會話的,以允許許多搜索相同內容的用戶快速查看相同的搜索結果。
在索引過程中,我們可以使用額外的表格將術語映射到文檔中,這將告訴我們給定術語出現哪些文檔。這將使我們能夠跳過許多試圖通過僅抓住術語允許我們快速生成的文檔列表來確定候選文檔ID的過程(或在profient of Profient of Profient of Profient cormection cormectient cormections conternical norkes digess Ids Ids Ids中,)。