我想从弹性搜索中检索数据。我在弹性搜索中索引数据,它看起来像下面的
{
"_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"
}
}
},
}
}
}
}
}
}'
答案 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的原始部分是关键字。