簡體   English   中英

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.com9200 / shopping / items / _search?q = nametelefon&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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM