在弹性搜索中搜索查询

时间:2017-08-11 14:25:51

标签: perl elasticsearch

我正在基于ElasticSearch的网站上创建搜索,我对ElasticSearch很新,所以我很乐意为您提供帮助。

这是我的ElasticSearch内容的结构:

hits:   
    0:  
        _index: "mysite"
        _type:  "products"
        _id:    "1"
        _score: 1
        _source:    
            name:   
                0:  "This is name"
            number: "N6"
            status: "Y"

这是我的Perl脚本:

my $e = Search::Elasticsearch->new();

my $results = $e->search(
    index => 'mysite',
    type => 'products',
    size => 3,
        body  => {
                query => {
                        match => { name => $query }
                }
        }
);

我想问你如何制作符合产品的脚本状态&#34; Y&#34; ,它应该找到一个< strong> substring 的名称,例如,如果$query包含&#34;是&#34;,它应该找到该产品,因为该产品包含&#34;是&#34;在名称&#34;这是名称&#34;,最后一个,它也应该搜索数字,例如,如果$query包含&#34; N6&#34;,它也应该找到那个产品。

这样的事情:(姓名或号码)和状态=&#34; Y&#34;

非常感谢。

更新

我将其重写为Perl语法,但我有语法错误:/

  query => {
      query_string => {
          query => {
            (name => $word OR number => $word) AND status => "Y"
          }
      }
  }

错误:

-evalfile error: syntax error at (eval 215) line 33, near "} OR "\nGlobal symbol "$e" requires explicit package name at (eval 215) line 40.

2 个答案:

答案 0 :(得分:1)

使用Query String Query尝试此查询。文档中还有很多其他选项。搜索某些关键字的能力取决于您设置的字段映射。

{
    "query": {
        "query_string" : {
            "query" : "name:is AND (state:Y OR number:N6)"
        }
    }
}

您需要将整个query_string查询视为字符串。所以查询看起来像这样:

my $e = Search::Elasticsearch->new();

my $results = $e->search(
    index => 'mysite',
    type => 'products',
    size => 3,
    body  => {
        query => "(name:$word OR number:$word) AND status:Y"
    }
);

答案 1 :(得分:0)

filters就是你想要的:

PUT myindex/_search
{
  "query": { 
    "bool": { 
      "filter": [{ 
        "should": [{ 
          "match": {"name": "is" },
          "term": {"number": "N6"}
        }],
        "must": {
          "term": {"status": "Y"}
        }        
      ]}
    }
  }
}

这假设您已将numberstatus作为未经分析的字符串或关键字类型(取决于version) - 如果其中存在离散数量的值,您应该这样做那些领域。否则,请为term交换match