2016-02-05 14 views
9

Dưới đây là mã của tôi để tạo chỉ mục bằng cách sử dụng elasticsearch.Index đang được tạo thành công. Về cơ bản, tôi đang sử dụng nó để tạo tự động đề xuất tùy thuộc vào tên phim, tên diễn viên và chi. Bây giờ yêu cầu của tôi là, tôi cần phải phù hợp với chuỗi con với trường cụ thể. Điều này làm việc tốt nếu tôi sử dụng $params['body']['query']['wildcard']['field'] = '*sub_word*';. (Tức là tìm kiếm 'to' cho 'tom kruz' nhưng tìm kiếm 'tom kr' không trả về kết quả nào) .Chuỗi kết hợp Elasticsearch trong php

Điều này chỉ khớp với một từ cụ thể trong chuỗi. Tôi muốn đối sánh chuỗi con chứa nhiều từ (ví dụ: 'tom kr' sẽ trả về 'tom kruz').

Tôi đã tìm thấy một vài tài liệu, cho biết sẽ có thể sử dụng 'ngram'. Nhưng tôi không biết, làm thế nào tôi nên thực hiện nó trong mã của tôi, như tôi đang sử dụng các cấu hình dựa trên mảng cho elasticsearch và tất cả các tài liệu hỗ trợ được đề cập đến cấu hình trong json fromat.

Vui lòng trợ giúp.

require 'vendor/autoload.php'; 

$client = \Elasticsearch\ClientBuilder::create() 
->setHosts(['http://localhost:9200'])->build(); 

/*************Index a document****************/ 
$params = ['body' => []]; 
$j = 1; 
for ($i = 1; $i <= 100; $i++) { 
    $params['body'][] = [ 
     'index' => [ 
      '_index' => 'pvrmod', 
      '_type' => 'movie', 
      '_id' => $i 
     ] 
    ]; 
    if ($i % 10 == 0) 
     $j++; 
    $params['body'][] = [ 
     'title' => 'salaman khaan'.$j, 
     'desc' => 'salaman khaan description'.$j, 
     'gener' => 'movie gener'.$j, 
     'language' => 'movie language'.$j, 
     'year' => 'movie year'.$j, 
     'actor' => 'movie actor'.$j, 
    ]; 

    // Every 10 documents stop and send the bulk request 
    if ($i % 10 == 0) { 
     $responses = $client->bulk($params); 

     // erase the old bulk request 
     $params = ['body' => []]; 

     unset($responses); 
    } 
} 

// Send the last batch if it exists 
if (!empty($params['body'])) { 
    $responses = $client->bulk($params); 
} 

Trả lời

5

Cố gắng tạo này JSON

{ 
"query": { 
    "filtered": { 
     "query": { 
      "bool": { 
       "should": [ 
        { 
         "wildcard": { 
          "field": { 
           "value": "tom*", 
           "boost": 1 
          } 
         } 
        }, 
        { 
         "field": { 
          "brandname": { 
           "value": "kr*", 
           "boost": 1 
          } 
         } 
        }, 
       ] 
      } 
     } 
    } 
} 

Bạn có thể phát nổ thuật ngữ tìm kiếm của bạn

$searchTerms = explode(' ', 'tom kruz'); 

Và sau đó tạo ra các ký tự đại diện cho mỗi một

foreach($searchTerms as $searchTerm) { 
//create the new array 
} 
+0

Kính gửi costa, Cảm ơn bạn đã trả lời.Nhưng chỉ là một truy vấn, bạn có chắc chắn, chạy tìm kiếm theo ký tự đại diện cho các từ riêng lẻ sẽ cho tôi kết quả phù hợp nhất với chuỗi phụ đa từ? –

6

Vấn đề ở đây nói dối s trong thực tế là Elasticsearch xây dựng một chỉ số đảo ngược. Giả sử bạn sử dụng máy phân tích tiêu chuẩn, câu "tom kruz là một khẩu súng hàng đầu" được chia thành 6 thẻ: tom - kruz - is - a - top - gun. Những mã thông báo này được gán cho tài liệu (với một số siêu dữ liệu về vị trí đó nhưng chúng ta hãy để nó ở bên cạnh bây giờ).

Nếu bạn muốn thực hiện một phần khớp, bạn có thể, nhưng chỉ trên các mã thông báo riêng biệt, không vượt quá giới hạn mã thông báo như bạn muốn. Đề xuất cho việc tách chuỗi tìm kiếm của bạn và tạo một truy vấn ký tự đại diện từ các chuỗi này là một tùy chọn.

Một tùy chọn khác thực sự sẽ sử dụng bộ lọc mã thông báo ngram hoặc edge_ngram. Những gì sẽ làm (tại thời gian chỉ số) là tạo ra những thẻ một phần (như t - to - tom - ... - k - kr - kru - kruz - ...) trước và bạn chỉ có thể đặt trong 'tom kr' trong tìm kiếm (đối sánh) của bạn và nó sẽ khớp. Hãy cẩn thận mặc dù: điều này sẽ sưng lên chỉ mục của bạn (như bạn có thể thấy, nó sẽ lưu trữ A LOT thẻ nhiều hơn), bạn cần custom analysers và có lẽ khá nhiều kiến ​​thức về ánh xạ của bạn.

Nói chung, tuyến đường (cạnh_) ngram là một ý tưởng tốt chỉ cho những thứ như tự động hoàn thành, không chỉ cho bất kỳ trường văn bản nào trong chỉ mục của bạn. Có một số cách để giải quyết vấn đề của bạn nhưng hầu hết đều liên quan đến việc xây dựng các tính năng riêng biệt để phát hiện các từ sai chính tả và cố gắng đề xuất các cụm từ phù hợp cho nó.

Các vấn đề liên quan