Elasticsearch 搜索无效结果
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
字段更改为数字字段,或者您需要添加一个数字类型的新字段并更改范围过滤器以使用该新字段。
我添加数据添加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
字段更改为数字字段,或者您需要添加一个数字类型的新字段并更改范围过滤器以使用该新字段。