我正在寻找ElasticSearch查询,它将在其中包含空格的字符串上提供完全匹配。
例如- 我想搜索像'XYZ Company Solutions'这样的词。 我尝试了查询字符串查询但它给了我所有的记录,无论搜索结果如何。我也读了帖子,发现我们必须为该字段添加一些映射。我在球场上尝试了'Not_Analyzed'分析仪,但它仍无法正常工作。
如果有人有完整的示例或步骤,那么请您与我分享一下吗?
提前致谢。
谢谢, 萨米尔
答案 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"}}
}
我们将获得匹配
这有助于在避免区分大小写的同时搜索完整的关键字