2017-08-11 66 views
2

我在ElasticSearch基础上创建网站搜索,对于ElasticSearch我很新,所以我很乐意提供任何帮助。Elastic Search中的搜索查询

这是我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 } 
       } 
     } 
); 

我想问你如何制作脚本,它匹配具有状态“Y”的产品,它应该找到名称的子串,例如,如果$query包含“is”时,应该找到该产品,因为该产品名称中包含“is”名称“This is name”,最后一个也应该搜索号码,例如,如果$query包含“N6”,则应该找到那个产品也是。

所以是这样的:(名称或号码),状态= “Y”

非常感谢你。

更新

我把它改写成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. 
+0

Perl或Elasticsearch中的语法错误?也请发布错误。 –

+0

它看起来是一个Perl错误,发布。我认为语法是正确的。 – tomsk

回答

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" 
    } 
); 
+0

已更新的问题 – tomsk

+0

不起作用 – tomsk

0

filters是你想要什么:

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

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

+0

query_string和过滤器有什么区别?什么更快? – tomsk

+0

错误:bool查询不支持[filter] – tomsk