2017-06-17 101 views
0

我是elasticsearch的初学者,我不知道解决我的问题。 这里是我的问题:ElasticSearch多个字段

{"email"=>"[email protected]", 
"full_name"=>"Lilla Fritz Ritchie", 
"location"=>"Connecticut", 
"postition"=>"Developer", 
"about"=> 
"Atque nihil dolorum et quod ea aut debitis. Aliquid commodi eos et architecto nostrum. Rerum aut sunt sed molestiae consequatur. Ut ut est id voluptatem maiores. Sed voluptate aut consequatur asperiores reprehenderit iure optio.", 
"skills"=> 
[{"name"=>"SQLServer", "year_experience"=>2}, 
    {"name"=>"MySQL", "year_experience"=>6}, 
    {"name"=>"Aps.net", "year_experience"=>7}, 
    {"name"=>"Ruby on Rails", "year_experience"=>8}, 
    {"name"=>"PHP", "year_experience"=>4}, 
    {"name"=>"Amazon EC2", "year_experience"=>4}], 
"id"=>3} 

这是ES用户的文件,我需要找到技能和相应的年经验的人。 示例:我的投入是Ruby on Rails 8年的经验和具有5年以上经验的亚马逊EC2技能。

=>期望的结果:

  • 有Ruby on Rails的技巧和ORDER BY年的经验
  • 有亚马逊EC2技能和ORDER BY年的经验。

任何人都可以帮助我如何为这种情况编写ES查询。对不起,我的英语不好。

+0

我假设您正在寻找“我的输入是Ruby on Rails 8年经验和亚马逊EC2技能以及5年经验”的技能。 – user3775217

回答

0

我不确定我是否理解你的映射。我希望以下查询能够回答你的问题。

{ 
     "query": { 
      "filtered": { 
        "filter": 
         "bool": { 
          "term": { 
           "skills.name": "Ruby" 
          } 
         } 
        } 
      } 
     }, 
     "sort": { 
      "skills.year_experience": { 
        "order": "asc" 
      } 
     } 
    } 

您还可以更改ascdesc如果排序是不正确的顺序。

0

我看了一下你的json文档,我建议你先为技能数据类型强制执行nested数据类型。

此外,在默认情况下,映射是标准分析器,它将打破你的输入空白,即“Ruby on Rails”将导致“红宝石”,“上”,“轨道”和standard分析仪不会保留倒序索引中的实际字段,除非您创建自定义分析器以将关键字小写或在映射中使用multi-fields以支持搜索其他用例。

在这里,我已经提供了最小的映射和您当前使用的用例的设置,您可以扩展它以支持其他用例。

我还建议你看看弹性的nested查询。

映射

PUT index_playtime1 
{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "lowercase_keyword": { 
        "tokenizer": "keyword", 
        "filter": ["lowercase"] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "document_type": { 
      "properties": { 
       "skills": { 
        "type": "nested", 
        "properties": { 
         "name": { 
          "type": "text", 
          "analyzer": "lowercase_keyword" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

查询

POST index_playtime1/document_type/_search 


    { 
    "sort": { 
     "skills.year_experience": { 
      "order": "asc" 
     } 
    }, 
    "query": { 
     "bool": { 
      "must": [{ 
        "nested": { 
         "path": "skills", 
         "query": { 
          "bool": { 
           "must": [{ 
            "bool": { 
             "must": [{ 
               "term": { 
                "skills.name": { 
                 "value": "ruby on rails" 
                } 
               } 
              }, 
              { 
               "term": { 
                "skills.year_experience": { 
                 "value": 8 
                } 
               } 
              } 
             ] 
            } 
           }] 
          } 
         } 
        } 
       }, 
       { 
        "nested": { 
         "path": "skills", 
         "query": { 
          "bool": { 
           "must": [{ 
            "bool": { 
             "must": [{ 
               "term": { 
                "skills.name": { 
                 "value": "amazon ec2" 
                } 
               } 
              }, 
              { 
               "term": { 
                "skills.year_experience": { 
                 "value": 4 
                } 
               } 
              } 
             ] 
            } 
           }] 
          } 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

希望这有助于。

让我们知道如果这不包含您的用例。