弹性搜索 - 搜索其中包含空格的字符串

时间:2015-04-28 15:06:12

标签: elasticsearch

我正在寻找ElasticSearch查询,它将在其中包含空格的字符串上提供完全匹配。

例如

- 我想搜索像'XYZ Company Solutions'这样的词。 我尝试了查询字符串查询但它给了我所有的记录,无论搜索结果如何。我也读了帖子,发现我们必须为该字段添加一些映射。我在球场上尝试了'Not_Analyzed'分析仪,但它仍无法正常工作。

如果有人有完整的示例或步骤,那么请您与我分享一下吗?

提前致谢。

谢谢, 萨米尔

2 个答案:

答案 0 :(得分:5)

由于您没有发布代码,因此很难说出错误,但映射中的"index": "not_analyzed"是处理此问题的正确方法。

这是一个简单的工作示例。首先,我创建一个使用"index": "not_analyzed"

的映射
PUT /test_index
{
    "mappings": {
        "doc": {
            "properties": {
                "name":{
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

然后添加几个文档进行测试

POST /test_index/doc/_bulk
{"index":{"_id":1}}
{"name":"XYZ Company Solutions"}
{"index":{"_id":2}}
{"name":"Another Company"}

现在我可以使用简单的term query

获取我想要的文档
POST /test_index/doc/_search
{
    "query": {
        "term": {
           "name": {
              "value": "XYZ Company Solutions"
           }
        }
    }
}
...
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 1,
            "_source": {
               "name": "XYZ Company Solutions"
            }
         }
      ]
   }
}

在这种情况下,term filter甚至match query也适用。

以下是我用来测试它的代码:

http://sense.qbox.io/gist/90fcc7f7a88d58f098c50d5aaf0315fdf06e9e9a

答案 1 :(得分:0)

{
    "env": {
        "shared-node-browser": true,
        "commonjs": true
    },
    "plugins": ["requirejs"],
    "extends": ["eslint:recommended"],
    "rules": {
        "indent": [
            "error",
            "tab"
        ],
        "linebreak-style": [
            "error",
            "windows"
        ],
        "quotes": [
            "error",
            "single"
        ],
        "semi": [
            "error",
            "always"
        ],
        "requirejs/no-invalid-define": 2,
        "requirejs/no-multiple-define": 2,
        "requirejs/no-named-define": 2,
        "requirejs/no-commonjs-wrapper": 2,
        "requirejs/no-object-define": 1
    }
}

我使用上面的设置和映射来定义索引。 然后将几个值推入数据库

PUT /index_1
{   
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": { "type": "custom", "char_filter": [],           "filter": ["lowercase"]}
      }
    }
  },
  "mappings": {
     "doc_type": {
            "properties": {
                "name":{"type": "keyword", "normalizer": "lowercase_normalizer"}
            }
     }
  }
}

现在,如果我们在上面索引的名称字段中搜索单个字母,我们什么都得不到回报

POST index_1/doc_type/1
{
  "name" : "a b c"
}

POST index_1/doc_type/1
{
  "name" : "a c"
}

POST index_1/doc_type/1
{
  "name" : "a b"
}

但如果我们搜索

GET index_1/doc_type/_search
{
  "query" : 
    {"match": {"name": "A"}}
}

GET index_1/doc_type/_search
{
  "query" : 
    {"match": {"name": "b"}}
}

我们将获得匹配

这有助于在避免区分大小写的同时搜索完整的关键字