2015-02-11 62 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