2016-04-09 133 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*" 
    } 
    } 
}