2015-02-11 95 views
1

我添加數據添加Elasticsearch驗證碼:Elasticsearch搜索現在的工作結果

$data = array("name"=>HelperMC::strToUtf8(trim($name)), 
     "urlname"=>HelperURL::strToURL(trim($name)), 
     "price"=>number_format(HelperParser::clearTextFromPrice($price), 2, ',', '.'), 
     "price_for_filter"=>HelperParser::clearTextFromPrice($price), 
     "image"=>$imgname, 
     "description"=>HelperMC::strToUtf8($description), 
     "keywords"=>HelperMC::strToUtf8($keywords), 
     "url"=>$k['url'], 
     "sitemap_id"=>intval($sitemapId), 
     "shop_id"=>$shop['shop_id'], 
     "logo"=>$shop['logo'], 
     "key"=>$hashKey, 
     "type"=>intval(1), 
     "shop_rating_count"=>intval($shop['rating_count']), 
     "shop_rating_point"=>intval($shop['rating_point']), 
     "created_at"=>date("Y-m-d H:i:s"), 
     "updated_at"=>date("Y-m-d H:i:s")); 

//create elasticsearch index 
HelperES::insertEntry(json_encode($data),$hashKey);  

我insertEntry功能:

private static $elasticBase = "http://localhost:9200/shopping/items"; 

public static function insertEntry($data_string,$id = false){ 
    if($id) 
     $url = self::$elasticBase."/".$id; 
    else 
     $url = self::$elasticBase; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL , $url); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    @$result = curl_exec($ch); 
    curl_close($ch); 

    return $result; 
} 

和我的搜索功能:

public static function search($keyword, $defaultOperator = "OR" ,$start = 0, $size = 25, $from = 0, $to = 10000, $shopsArr = array(),$orderBy = "price", $order = "asc"){ 
    $searchUrl = self::$elasticBase."/_search"; 

    if(count($shopsArr) > 0){ 
     $query = '{ 
         "from" : '.$start.', "size" : '.$size.', 
         "query" : { 
          "filtered" : { 
          "query": { 
           "query_string": { "query": "'.$keyword.'", 
           "fields": ["name","urlname"], 
           "default_operator": "'.$defaultOperator.'" 
           } 
           }, 
           "filter" : { 
            "bool" : { 
             "must" : { 
              "terms" : { "sitemap_id" : '.json_encode($shopsArr).' } 
             }, 
             "must" : { 
              "range" : { 
                 "price_for_filter" : { 
                  "from" : "'.$from.'", 
                  "to" : "'.$to.'" 
                 } 
                 } 
             } 
           } 
          } 
         } 
        }, 
        "sort" : [ 
           {"'.$orderBy.'" : {"order" : "'.$order.'", "mode" : "avg"}} 
          ] 
       }'; 
    }else{ 
     $query = '{ 
       "from" : '.$start.', "size" : '.$size.', 
       "query" : { 
        "filtered" : { 
        "query": { 
          "query_string": { 
           "query": "'.$keyword.'", 
           "fields": ["name","urlname"], 
           "default_operator": "'.$defaultOperator.'" 
          } 
          }, 
         "filter" : { 
          "range" : { 
           "price_for_filter" : { 
            "from" : "'.$from.'", 
            "to" : "'.$to.'" 
           } 
          } 
         } 
        } 
       }, 
       "sort" : [ 
          {"'.$orderBy.'" : {"order" : "'.$order.'", "mode" : "avg"}} 
         ] 
      }'; 
    } 


    echo $query;  


    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL , $searchUrl); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    @$result = curl_exec($ch); 
    curl_close($ch); 
    return $result; 
} 

但我的搜索結果不工作。

實施例:http://goo.gl/KHO1Ia

工作,但,

http://goo.gl/GB8uUV

不工作。

請幫我嗎?謝謝

回答

0

查看shopping索引的映射,它顯示您的price_for_filter字段實際上是一個字符串,而不是數字類型。因此,您的範圍過濾器正在進行字符串比較,而不是數字比較。這是過濾掉所有的結果。

舉例來說,您的範圍是從「0」過濾到「100000」。您的第一個預期結果的price_for_filter值是「12.97」。當進行字符串比較時,「12.97」大於「0」,但是,作爲字符串,它也大於「100000」,所以該結果被過濾掉(「12」>「10」)。

您或者需要將price_for_filter字段更改爲數字字段,或者您需要添加一個新的字段(數字類型)並更改您的範圍過濾器以使用該新字段。

+0

感謝您的回答,但我的其他查詢工作 - > http://goo.gl/AuxCrR – 2015-02-11 14:43:12

+0

@ArzuDemir該頁面顯示錯誤。 – patricus 2015-02-11 16:26:42

+0

我現在在測試,請重新檢查。謝謝 – 2015-02-11 16:35:46