2017-08-11 65 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