我正在尝试使用elasticsearch检索一些公司结果。我想让那些以" A"然后" B"等开头的公司。如果我只是用"前缀"做一个非常典型的查询。像这样
GET apple/company/_search
{
"query": {
"prefix": {
"name": "a"
}
},
"fields": [
"id",
"name",
"websiteUrl"
],
"size": 100
}
但这会让Acme和Lemur and Associates一起回归,所以我需要在整个名字的开头区分A,而在一个单词的开头只区分A.
似乎正常的表达式会在这里得到拯救,但弹性搜索只会忽略我尝试的任何东西。在使用其他应用程序进行的测试中,^[\S]a*
应该会为您提供以A
开头并且前面没有空格的任何内容。弹性搜索返回0结果,其中包含以下内容:
GET apple/company/_search
{
"query": {
"regexp": {
"name": "^[\S]a*"
}
},
"fields": [
"id",
"name",
"websiteUrl"
],
"size": 100
}
在FACT中,Elasticsearch的Sense UI会立即提醒您注意错误的字符串语法错误"。这是因为即使在查询中,弹性搜索也希望某些字符被转义。尽管如此,^[\\S]a*
也无法正常工作。
答案 0 :(得分: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*"
}
}
}