Asked Aug 28th, 2018 8:19 a.m. 191 0 1
  • 191 0 1
0

Search giống like trong elastichSearch

Share
  • 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 ANSWERS


Answered Aug 28th, 2018 8:31 a.m.
+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

Share
Aug 28th, 2018 8:32 a.m.

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"...

0
| Reply
Share
Aug 28th, 2018 8:35 a.m.

À, 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

+1
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.