2016-04-09 132 views
1

我試圖使用elasticsearch檢索一些公司結果。我想,與「A」開頭的公司,然後「B」等,如果我只是做一個非常典型的查詢與「前綴」像這樣正則表達式和彈性搜索

GET apple/company/_search 
{ 
    "query": { 
    "prefix": { 
     "name": "a" 
    } 
    }, 
    "fields": [ 
    "id", 
    "name", 
    "websiteUrl" 
    ], 
    "size": 100 
} 

但是,這將返回Acme公司以及狐猴和同事們,所以我需要在整個名字的開始時區分A,而在詞的開始時區分A。

看起來像正則表達式會在這裏拯救,但彈性搜索只是忽略了我嘗試的任何東西。在其他應用程序的測試中,^[\S]a*應該爲您提供任何以A開頭並且前面沒有空格的內容。彈性搜索返回0結果有以下:

GET apple/company/_search 
{ 
    "query": { 
    "regexp": { 
     "name": "^[\S]a*" 
    } 
    }, 
    "fields": [ 
    "id", 
    "name", 
    "websiteUrl" 
    ], 
    "size": 100 
} 

其實Sense界面的Elasticsearch會立即提醒您一個「錯誤的字符串語法錯誤」。這是因爲即使在查詢中,彈性搜索也需要一些字符轉義。儘管如此,^[\\S]a*也不起作用。

+0

嘗試'\ b'字邊界而不是'[\ S]'。 –

回答

2

在Elasticsearch中搜索的內容是關於查詢本身,但也關於您的數據的建模,因此它適合最好的查詢使用。一個人不能簡單地索引任何東西,然後努力想出一個能夠做某事的查詢。

的Elasticsearch方式您所查詢的是有該字段的以下映射:

PUT /apple 
{ 
    "settings": { 
    "index": { 
     "analysis": { 
     "analyzer": { 
      "keyword_lowercase": { 
      "type": "custom", 
      "tokenizer": "keyword", 
      "filter": [ 
       "lowercase" 
      ] 
      } 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "company": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "fields": { 
      "analyzed_lowercase": { 
       "type": "string", 
       "analyzer": "keyword_lowercase" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

,並使用此查詢

GET /apple/company/_search 
{ 
    "query": { 
    "prefix": { 
     "name.analyzed_lowercase": { 
     "value": "a" 
     } 
    } 
    } 
} 

GET /apple/company/_search 
{ 
    "query": { 
    "query_string": { 
     "query": "name.analyzed_lowercase:A*" 
    } 
    } 
}