根据弹性搜索

时间:2017-11-29 18:40:43

标签: elasticsearch

我想从弹性搜索中检索数据。我在弹性搜索中索引数据,它看起来像下面的

{
  "_index": "user",
  "_type": "user_type",
  "_id": "2393294",
  "_version": 1,
  "_score": 2,
  "_source": {
    "name": "shwn decker",
    "worksFor": {
      "legalName": "nykc private fund",
      "address": "Mk street, bruke field"
    },
  },
  "fields": {
    "tweetDate": [
      1457481600000
     ]
   },
   "sample_date":"10/10/2013"
 }

我想根据字段" name"来搜索数据。和" legalName"。我尝试了一些查询但是当我尝试根据这两个字段过滤数据时,没有文档得到匹配。 我使用的查询是:

 curl -XGET 'localhost:9200/user/user_type/_search?pretty' -H 'Content- Type: application/json' -d'
{
   "query":{
      "bool":{
         "must":{
             "query_string": {
                "query": "shwn decker",
             "fields": ["name"]
          }
         },
         "filter":{
            "term":{
                   "worksFor.legalName":"nykc private fund"
            }
         }
      }
   }
}'

我应该在查询中做什么修改,以便我可以得到结果。我正在使用此数据的自定义映射,如下所示:

{
  "settings":
  {
    "number_of_shards" : 3,
    "number_of_replicas" : 2
  },
    "mappings" : {
      "user_type" : {
        "properties" : {
          "name" : {
            "type" : "text",
            "fields" : {
                  "raw" : {
                   "type":"keyword"
                   }
       }
          },
           "worksFor" : {
            "properties" : {
              "address" : {
                "type" : "text"
              },
              "legalName" : {
                "type" : "text",
                 "fields" : {
                  "raw" : {
                  "type":"keyword"
                   }
      }
              },
            }
          }
        }
      }
    }
  }'

1 个答案:

答案 0 :(得分:0)

我假设您在索引数据之前没有定义任何映射,并且所有字段都被编入索引为 text ,这意味着它们会被分析。这意味着而不是

  

nykc私募基金

您的索引在 worksFor.legalName 键下包含此文档的三个单独的单词。

然后你尝试进行未分析的terms过滤器,实际上你将整个短语与单个单词进行比较。这就是为什么你没有得到任何结果。如果您仍想要进行术语过滤,则应将此字段定义为keyword

所以你需要做的是删除你的索引,定义映射,至少对于这个特定的字段,然后再次索引你的数据。以下是为字段定义映射的方法

PUT localhost:9200/user

{
  "mappings": {
    "user_type": {
      "properties": {
        "worksFor.legalName": {
          "type": "keyword"
        }
      }
    }
  }
}

然后相同的查询应该返回您的文档。

修改: 以上所有内容仍然有效,但编辑了问题并附加了映射定义。有了这样的映射,应该有:

{
 "query":{
    "bool":{
       "must":{
           "query_string": {
              "query": "shwn decker",
           "fields": ["name"]
        }
       },
       "filter":{
          "term":{
                 "worksFor.legalName.raw":"nykc private fund"
          }
       }
    }
 }

}

这是因为legalName的原始部分是关键字。