Yêu cầu thg 8 28, 2018 8:19 SA 191 0 1
  • 191 0 1
0

Search giống like trong elastichSearch

Chia sẻ
  • 191 0 1

Hi mọi người ! Mình là người mới làm elaticsearch. Mình có yêu cầu là search giống like trong elaticsearch. cụ thể giả sử mình nhập tên là "An" sẽ ra cả tên là "Ánh", là "Lan", là "Tân".... Mình dùng thư viện elaticsearch của laravel.https://github.com/elasticquent/Elasticquent mình cấu hình model của laravel theo code sau:

class Customer extends Model
{
	use ElasticquentTrait;

    protected $table = 'customers';
    protected $fillable = [ 'name' ];
    protected $hidden = [ 'created_at', 'updated_at', 'deleted_at' ];

    protected $mappingProperties = array(
        'name' => [
            'type' => 'text',
            "analyzer" => "default333",
        ],
    );
    
    protected $indexSettings = [
        'analysis' => [
            'char_filter' => [
                'replace' => [
                    'type' => 'mapping',
                    'mappings' => [
                        '&=> and '
                    ],
                ],
            ],
            'filter' => [
                'word_delimiter' => [
                    'type' => 'word_delimiter',
                    'split_on_numerics' => false,
                    'split_on_case_change' => true,
                    'generate_word_parts' => true,
                    'generate_number_parts' => true,
                    'catenate_all' => true,
                    'preserve_original' => true,
                    'catenate_numbers' => true,
                ]
            ],
            'analyzer' => [
                'default333' => [
                    'type' => 'custom',
                    'char_filter' => [
                        'html_strip',
                        'replace',
                    ],
                    'tokenizer' => 'icu_tokenizer',
                    'filter' => [
                        'lowercase',
                        'word_delimiter',
                        'asciifolding',
                        'icu_normalizer'
                    ],
                ],
            ],
        ],
    ];
}

còn đây là câu query của mình :

 public function autocomplete(Request $request)
    {
        $name = $request->query('q');
        
        $customers = Customer::searchByQuery([
            'wildcard' => [ 
                'name' => '*'.$name.'*'
            ]
        ]);
     }
   }

nhưng khi mình gõ chữ "an" thì ko ra được tên như trên. Nhờ mọi người giúp đỡ với...

1 CÂU TRẢ LỜI


Đã trả lời thg 8 28, 2018 8:31 SA
+1

Mình chưa dùng thư viện này bao giờ và thực sự cũng chưa biết bạn đang dùng thư viện nào :v, nhưng câu truy vấn Elastic search cơ bản để search một field như ý bạn như sau:

{
    "body": {
        "query": {
            "match": {
                "<field_name>": "There are keywords"
            }
        }
    }
}

Còn nếu bạn muốn search theo nhiều fields thì câu truy vấn cơ bản như sau:

{
    "body": {
        "query": {
            "multi_match": {
                "query": "There are keywords",
                "fields": [
                    "first_field",
                    "second_field"
                ]
            }
        }
    }
}

Bạn tham khảo documentation: tại đây

Chia sẻ
thg 8 28, 2018 8:32 SA

Nhưng mà search kia mình gõ "an" thì chỉ ra ai tên là "an", không ra được có dấu như "ánh" , "tân"...

thg 8 28, 2018 8:35 SA

À, mình vừa xem config của bạn ở trên, có vể bộ analyzer mà bạn đang dùng trong config chưa analytics được tiếng Việt. Bạn có thể tham khảo link bài viết Viblo sau để hiểu thêm nha. Vì giải thích thì khá là dài dòng. Link tại đây

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí