sortingelasticsearchresultsetexact-match

Elasticsearch exact result not return on a first


I have added some products like 'lcd apple iphone 11' 'lcd apple iphone x' 'lcd apple iphone xs' 'lcd apple iphone xr' 'lcd samsung s8' 'lcd samsung s8+' 'lcd apple iphone xs max' 'lcd apple iphone xr battery' we had added iphone xr product in last so

I have created elasticsearch index products_idx1 and type product.

When I search product like apple iphone xr so it returns iphone xr but not come at top result.

What I want Exact result should be first then partial result should be after exact result .I want a sort the result based on accuracy result.

Here is my code in php elasticsearch

<?php

    use Elasticsearch\ClientBuilder;

    require 'vendor/autoload.php';

   $client = ClientBuilder::create()->build();
 $values =['name','name.prefix','name.suffix','sku'];
$params =
[
'client'=>['verify'=>1,'connect_timeout'=>5],
'from'=> 0,
'size'=>25,
 'body'  =>[
'query' => [
 'bool'=>
            [
            'should'=> [[
                'multi_match'=> ['query'=>'apple iphone xr','type'=>'cross_fields','fields'=>$values,'operator'=>'AND']
                ],
                ['match'=>['all'=>['query'=>'apple iphone xr','operator'=>'AND','fuzziness'=>'AUTO'] ]]
                ]
            ]

],
'sort'=>['_score'=>['order'=>'desc']],
],

'index'=>'products_idx1'
];

 $response = $client->search($params);
echo "<pre>";print_r($response);

Solution

  • while bhavya's answer is working but its more complicated as its using the match_phrase query which is more complicated and might be more costly based on the dataset you might have, I have created a simpler version of this query which works.

    Index sample docs

    {
        "title" : "lcd apple iphone xr"
    }
    {
        "title" : "lcd apple iphone 11"
    }
    {
        "title" : "lcd apple iphone x"
    }
    {
        "title" : "lcd apple iphone xs"
    }
    {
        "title" : "iphone xr"
    }
    

    Search query which uses additional simpler match clause

    {
        "query": {
            "bool": {
                "should": [
                    {
                        "match": {
                            "title" : "apple iphone xr"
                        }
                    },
                    {
                        "match": {    --> simple additional match clause solves issue.
                            "title": "iphone xr"
                        }
                    }
                ]
            }
        }
    }
    

    And search result showing iphone xr at top, with more score

     "hits": [
                {
                    "_index": "64129903",
                    "_type": "_doc",
                    "_id": "6",
                    "_score": 1.8347404, // note score is higher than other results.
                    "_source": {
                        "title": "iphone xr"
                    }
                },
                {
                    "_index": "64129903",
                    "_type": "_doc",
                    "_id": "2",
                    "_score": 1.8268716,
                    "_source": {
                        "title": "lcd apple iphone xr"
                    }
                },
                {
                    "_index": "64129903",
                    "_type": "_doc",
                    "_id": "3",
                    "_score": 0.54542315,
                    "_source": {
                        "title": "lcd apple iphone 11"
                    }
                },
                {
                    "_index": "64129903",
                    "_type": "_doc",
                    "_id": "4",
                    "_score": 0.54542315,
                    "_source": {
                        "title": "lcd apple iphone x"
                    }
                },
                {
                    "_index": "64129903",
                    "_type": "_doc",
                    "_id": "5",
                    "_score": 0.54542315,
                    "_source": {
                        "title": "lcd apple iphone xs"
                    }
                }
            ]