[英]Elasticsearch search not working result
我添加數據,然后在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 : //azdanaz.com : 9200 / shopping / items / _search?q = name : telefon&pretty
工作,但是
http://www.azdanaz.com/arama/telefon
不工作。
查看shopping
索引的映射,它表明您的price_for_filter
字段實際上是字符串,而不是數字類型。 因此,您的范圍過濾器正在執行字符串比較,而不是數字比較。 這會過濾掉所有結果。
為了說明這一點,您的范圍從“ 0”到“ 100000”進行過濾。 您的第一個預期結果的price_for_filter
值為“ 12.97”。 在進行字符串比較時,“ 12.97”大於“ 0”,但是,作為字符串,它也大於“ 100000”,因此該結果被濾除(“ 12”>“ 10”)。
您要么需要將price_for_filter
字段更改為數字字段,要么需要添加一個新的數字類型字段,並更改范圍過濾器以使用該新字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.