2016-04-15 77 views
0

我遇到了彈性搜索的下列問題,有誰知道我應該在哪裏排除故障?彈性搜索 - 沒有命中雖然應該有結果

我高興地檢索結果用下面的查詢: {

"query" : { 
    "match" : { "name" : "A1212001" } 
} 

}

但是,當我細化搜索「name」字段的值的子,我沒有沒有命中? {

"query" : { 
    "match" : { "name" : "A12120" } 
} 

}

「A12120」 是已經打到查詢 「A1212001」

+0

你想要搜索'A12120 *'? – Richa

+0

我使用的版本是:elasticsearch-2.3.1 –

回答

0

如果你沒有太多的文件,你可以用一個regexp query

POST /index/_search 
{ 
    "query" :{ 
    "regexp":{ 
     "name": "A12120.*" 
    } 
    } 
} 

甚至wildcard one

POST /index/_search 
{ 
    "query": { 
    "wildcard" : { "name" : "A12120*" } 
    } 
} 

然而,隨着@Waldemar建議,如果你在你的指標,最好的辦法很多文件這是因爲上述查詢不是超高性能的,所以使用EdgeNGram tokenizer

首先,定義你這樣的指標設置:

PUT index 
{ 
    "settings" : { 
     "analysis" : { 
      "analyzer" : { 
       "my_analyzer" : { 
        "type": "custom", 
        "tokenizer" : "edge_tokens", 
        "filter": ["lowercase"] 
       } 
      }, 
      "tokenizer" : { 
       "edge_tokens" : { 
        "type" : "edgeNGram", 
        "min_gram" : "1", 
        "max_gram" : "10", 
        "token_chars": [ "letter", "digit" ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "my_type": { 
      "properties": { 
       "name": { 
        "type": "string", 
        "analyzer": "my_analyzer", 
        "search_analyzer": "standard" 
       } 
      } 
     } 
    } 
} 

然後,索引的名字字段包含A1212001文檔時,下面的標記將被索引:AA1A12A121A1212A12120,A121200,A1212001。所以,當你搜索A12120時,你會發現一個匹配。

+0

謝謝,這有助於。如果我創建自定義分析器會不會很糟糕,因此子串的所有排列都會被標記化?例如A,A1,A12,A121,A1212,A12120,A121200,A1212001,1,12,121,1212 ....'因爲我想做子字符串匹配,只要字段包含我的查詢字符串,那麼它應該被擊中。 –

+0

不用擔心,在這種情況下,只需使用'nGram'而不是'edgeNGram',它也會索引所有子字符串。這是正確的路要走。 – Val

0

您是否使用了Match Query此查詢將檢查內部的Lucene方面的子,你的任期A1212001如果你需要找到你的術語的一部分,你可以使用Regex Query,但你需要知道,使用正則表達式會有一些內部影響,因爲碎片將檢查你的所有術語。

如果你需要一個更「專業」的方法來搜索術語的一部分,你可以使用NGrams