JanusGraph — 索引參數與全文索引查詢(janusgraph Index parameters and full text search)
- 2019 年 10 月 4 日
- 筆記
定義混合索引時,可以為添加到索引的每個屬性鍵選擇性地指定參數列表。 這些參數控制特定鍵的索引方式。JanusGraph識別以下索引參數。 是否支援這些取決於配置的索引後端。 除了此處列出的參數之外,特定索引後端還可能支援自定義參數。
索引參數:創建索引時的參數 ,類似於 Mapping.TEXT.asParameter() 這種 全文索引:可以通過索引參數控制字元串是 text全文索引還是string,如果為Text則可以進行全文索引
24.1 全文檢索
索引字元串值(即具有String.class數據類型的屬性鍵)時, 可以選擇將這些值索引為由mapping參數類型控制的文本或字元串。
當該值被索引為文本時,該字元串被標記為一個單詞包, 其允許用戶有效地查詢包含一個或多個單詞的所有匹配。 這通常稱為全文搜索。當該值被索引為字元串時, 該字元串是索引「as-is」而沒有任何進一步的分析或標記化。 這有助於查詢精確的字元序列匹配。這通常稱為字元串搜索。
24.1.1 全文檢索
默認情況下,字元串被索引為文本。要使此索引選項顯式,可以在將屬性鍵索引為文本時定義映射。
mgmt = graph.openManagement() summary = mgmt.makePropertyKey('booksummary').dataType(String.class).make() mgmt.buildIndex('booksBySummary', Vertex.class).addKey(summary, Mapping.TEXT.asParameter()).buildMixedIndex("search") mgmt.commit()
這與標準的混合索引定義相同,只添加了一個額外的參數來指定索引中的映射 – 在本例中Mapping.TEXT。
當字元串屬性被索引為文本時,字元串值被標記化為一包令牌。 確切的標記化取決於索引後端及其配置。JanusGraph的默認標記化將字元串拆分為非字母數字字元, 並刪除少於2個字元的任何標記。索引後端使用的標記化可能不同(例如,刪除了停用詞), 這可能導致在事務內部的修改和索引後端中的已提交數據處理全文搜索查詢的方式方面存在細微差別。
當字元串屬性被索引為文本時,索引後端僅在圖形查詢中支援全文搜索謂詞。全文搜索不區分大小寫。
- textContains:如果(至少)文本字元串中的一個單詞與查詢字元串匹配,則為true
- textContainsPrefix:如果(至少)文本字元串中的一個單詞以查詢字元串開頭,則為true
- textContainsRegex:如果(至少)文本字元串中的一個單詞與給定的正則表達式匹配,則為true
- textContainsFuzzy:如果(至少)文本字元串中的一個單詞與查詢字元串相似(基於Levenshtein編輯距離),則為true
import static org.janusgraph.core.attribute.Text.* g.V().has('booksummary', textContains('unicorns')) g.V().has('booksummary', textContainsPrefix('uni')) g.V().has('booksummary', textContainsRegex('.*corn.*')) g.V().has('booksummary', textContainsFuzzy('unicorn'))
字元串搜索謂詞(見下文)可用於查詢,但那需要在記憶體中進行過濾,這可能非常昂貴。
24.1.2 字元串搜索
要將字元串屬性索引為字元序列而不進行任何分析或標記化,請將映射指定為Mapping.STRING:
mgmt = graph.openManagement() name = mgmt.makePropertyKey('bookname').dataType(String.class).make() mgmt.buildIndex('booksBySummary', Vertex.class).addKey(name, Mapping.STRING.asParameter()).buildMixedIndex("search") mgmt.commit()
配置字元串映射後,字元串值將被編入索引,並且可以「as-is」查詢 ,包括停用詞和非字母字元。但是,在這種情況下,查詢必須匹配整個字元串值。 因此,在索引被認為是一個令牌的短字元序列時,字元串映射很有用。
當字元串屬性被索引為字元串時,索引後端在圖形查詢中僅支援以下謂詞。字元串搜索區分大小寫。
- eq:如果字元串與查詢字元串相同
- neq:如果字元串不同於查詢字元串
- textPrefix:如果字元串值以給定的查詢字元串開頭
- textRegex:如果字元串值與給定的正則表達式完全匹配
- textFuzzy:如果字元串值類似於給定的查詢字元串(基於Levenshtein編輯距離)
import static org.apache.tinkerpop.gremlin.process.traversal.P.* import static org.janusgraph.core.attribute.Text.* g.V().has('bookname', eq('unicorns')) g.V().has('bookname', neq('unicorns')) g.V().has('bookname', textPrefix('uni')) g.V().has('bookname', textRegex('.*corn.*')) g.V().has('bookname', textFuzzy('unicorn'))
可以在查詢中使用全文搜索謂詞,但是那些需要在記憶體中進行過濾,這可能是非常昂貴的。
24.1.3 全文和字元串搜索
如果您使用Elasticsearch,則可以將屬性索引為文本和字元串,從而允許您使用所有謂詞進行精確匹配和模糊匹配。
mgmt = graph.openManagement() summary = mgmt.makePropertyKey('booksummary').dataType(String.class).make() mgmt.buildIndex('booksBySummary', Vertex.class).addKey(summary, Mapping.TEXTSTRING.asParameter()).buildMixedIndex("search") mgmt.commit()
請注意,數據將存儲在索引中兩次,一次用於精確匹配,一次用於模糊匹配。
24.2 地理映射
默認情況下,JanusGraph支援使用點類型索引地理屬性並通過圓或框查詢地理屬性。 要索引支援按任何地理位置類型查詢的非點地理屬性,請將映射指定為Mapping.PREFIX_TREE:
mgmt = graph.openManagement() name = mgmt.makePropertyKey('border').dataType(Geoshape.class).make() mgmt.buildIndex('borderIndex', Vertex.class).addKey(name,Mapping.PREFIX_TREE.asParameter()).buildMixedIndex("search") mgmt.commit()
可以指定其他參數來調整基礎前綴樹映射的配置。這些可選參數包括前綴樹中使用的級別數以及相關的精度。
mgmt = graph.openManagement() name = mgmt.makePropertyKey('border').dataType(Geoshape.class).make() mgmt.buildIndex('borderIndex', Vertex.class).addKey(name, Mapping.PREFIX_TREE.asParameter(), Parameter.of("index-geo-max-levels", 18), Parameter.of("index-geo-dist-error-pct", 0.0125)).buildMixedIndex("search") mgmt.commit()
請注意,某些索引後端(例如Solr)可能需要額外的外部架構配置來支援和調整索引非點屬性。
如果轉載此博文,請附上本文鏈接https://blog.csdn.net/csdn___lyy,謝謝合作~ 如果感覺這篇文章對您有所幫助,請點擊一下「喜歡」或者「關注」部落客,您的喜歡和關注將是我前進的最大動力!=.=