简体   繁体   中英

Elasticsearch search not working result

I add data add Elasticsearch this code:

$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);    

My insertEntry Function:

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;
}

and my search Function:

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;
}

But my search results not working.

Example: http://azdanaz.com:9200/shopping/items/_search?q=name:telefon&pretty

working but,

http://www.azdanaz.com/arama/telefon

not working.

Looking at the mapping for your shopping index, it shows that your price_for_filter field is actually a string, not a numeric type. Therefore, your range filter is doing a string comparison, not a numeric comparison. This is filtering out all of your results.

To illustrate, your range is filtering from "0" to "100000". The price_for_filter value of your first expected result is "12.97". When doing a string comparison, "12.97" is greater than "0", however, as a string, it is also greater than "100000", so this result gets filtered out ("12" > "10").

You either need to change the price_for_filter field to be a numeric field, or you need to add a new field that is a numeric type and change your range filter to use that new field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM