2017-05-12 25 views
1

我需要在哪些地方需要使用以下標準執行搜索。如何在Elasticsearch中選擇合適的分析器

1]不區分大小寫匹配
2]的特殊字符匹配

3]部分匹配

我使用「的ngram濾波器」,如下所示,滿足上述所有需求 但是我將被編入索引非常龐大的數據,將有像「評論」,「描述」等字段,可能長達150字。 從網站的引用我認爲使用「ngram」過濾器將導致大量磁盤空間使用。 是否有任何替代,以滿足上述要求

{ 
     "template": "*", 
     "settings": { 
      "analysis": { 
       "filter": { 
        "ngram_filter": { 
         "type": "ngram", 
         "min_gram": 1, 
         "max_gram": 25 
        } 
       }, 
       "analyzer": { 
        "case_insensitive": { 
         "tokenizer": "whitespace", 
         "filter": [ 
          "ngram_filter", 
          "lowercase" 
         ] 
        }, 
        "search_analyzer": { 
         "type": "custom", 
         "tokenizer": "whitespace", 
         "filter": "lowercase" 
        } 
       } 
      } 
     }, 
     "mappings": { 
      "incidents": { 
       "dynamic_templates": [ 
        { 
         "strings": { 
          "match_mapping_type": "string", 
          "mapping": { 
           "type": "string", 
           "fields": { 
            "keyword": { 
             "type": "keyword", 
             "ignore_above": 256 
            } 
           }, 
           "analyzer": "case_insensitive", 
           "search_analyzer": "search_analyzer" 
          } 
         } 
        } 
       ] 
      } 
     } 
    } 

謝謝!

回答

1

我想那搜索性能也很關鍵,在這種情況下你必須使用ngrams。但是你可以嘗試減小最小的ngram大小。例如,如果可以通過一個或兩個字母跳過匹配,則可以將min_gram設置爲3或更大。它會稍微減少磁盤使用量。

也可以使用wildcardquery_string查詢部分匹配。第一個是區分大小寫的,第二個不是。在這種情況下,您不會有磁盤使用開銷,但會顯着降低性能。

它通常是搜索速度和磁盤使用率之間的折中。通常最好做一個適當的預索引(n-gram方法)以達到所需的性能

+0

感謝隨機! ,我嘗試使用通配符進行部分匹配,但匹配區分大小寫,因此無法使用它。 我們可以對包含大約150-200字的字段使用ngram過濾器。 – SSG

+0

您也可以嘗試'query_string'查詢。但出於性能原因,最好繼續使用n-gram。它不應該帶來太多的開銷,因爲它們也是令牌而不是唯一的。所以,令牌本身只存儲一次。標記條目存儲爲引用,而不是整個字符串 – Random

+0

我已經發布了具有相同上下文的另一個問題,您可以在此幫忙嗎? https://stackoverflow.com/questions/44300200/elasticsearch-can-we-apply-both-n-gram-and-language-analyzers-during-indexing – SSG