2011-11-09 32 views
9

Tôi đang sử dụng thư viện php của elasticsearch để lập chỉ mục và tìm tài liệu trong trang web của mình. Đây là mã để tạo chỉ mục:Elasticsearch không trả về số ít/số nhiều phù hợp

curl -XPUT 'http://localhost:9200/test/' -d ' 
{ 
    "index": { 
    "numberOfShards": 1, 
    "numberOfReplicas": 1 
    } 
}' 

Sau đó, tôi sử dụng curl XPUT để thêm tài liệu vào chỉ mục và XGET để truy vấn chỉ mục. Điều này hoạt động tốt ngoại trừ thực tế là các thông số và số nhiều từ truy vấn không khớp với chỉ mục trong khi trả lại kết quả. Ví dụ: khi tôi tìm kiếm "thảo luận", các kết quả phù hợp cho "thảo luận" không được trả về và ngược lại. Tại sao cái này rất? Tôi nghĩ rằng điều này được đưa về chăm sóc theo mặc định trong elasticsearch. Có điều gì mà chúng ta phải đề cập một cách rõ ràng cho nó để phù hợp với các dạng số ít/số nhiều không?

Trả lời

6

Bằng cách nào đó snowball không làm việc cho tôi ... đang nhận được lỗi như tôi đã đề cập trong các bình luận để @ imotov của câu trả lời . Tôi sử dụng thân cây porter và nó làm việc hoàn hảo cho tôi. Đây là cấu hình tôi đã sử dụng:

curl -XPUT localhost:9200/index_name -d ' 
{ 
"settings" : { 
    "analysis" : { 
     "analyzer" : { 
      "stem" : { 
       "tokenizer" : "standard", 
       "filter" : ["standard", "lowercase", "stop", "porter_stem"] 
      } 
     } 
    } 
}, 
"mappings" : { 
    "index_type_1" : { 
     "dynamic" : true, 
     "properties" : { 
      "field1" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      }, 
      "field2" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      } 
     } 
     } 
    } 
}' 
7

Trình phân tích tìm kiếm elascticsearch mặc định không làm xuất phát và đây là những gì bạn cần để xử lý số nhiều/số ít. Bạn có thể thử sử dụng Snowball Analyzer cho các lĩnh vực văn bản của bạn để xem nếu nó hoạt động tốt hơn đối với trường hợp sử dụng của bạn:

curl -XPUT 'http://localhost:9200/test' -d '{ 
    "settings" : { 
     "index" : { 
      "number_of_shards" : 1, 
      "number_of_replicas" : 1 
     } 
    }, 
    "mappings" : { 
     "page" : { 
      "properties" : { 
       "mytextfield": { "type": "string", "analyzer": "snowball", "store": "yes"} 
      } 
     } 
    } 
}' 
+0

Cảm ơn câu trả lời. Hãy để tôi thử này và xem nếu nó hoạt động – Ninja

+0

Tôi đã cố gắng này và tôi nhận được một lỗi: "Tin nhắn: Không tải được thiết lập lớp [loại] với giá trị [snowball]". Tôi có nên cài đặt thêm thứ gì đó ở đây không? Nếu có thì đâu và ở đâu? – Ninja

+0

Bạn đang sử dụng phiên bản elasticsearch nào? Tôi đã thử nghiệm nó trên 0,17 và trên tổng thể và nó hoạt động tốt trên cả hai với các thiết lập mặc định. Bạn có sửa đổi lệnh bằng bất kỳ cách nào không? – imotov

6

Vì bộ lọc 'porterStem' quá nhạy cảm, nó phù hợp hơn nếu bạn sử dụng bộ lọc 'minimal_english'. 'porterStem' tạo các mã thông báo tương tự cho các từ như:

tìm kiếm 'Kiểm tra' sẽ cho kết quả 'Thử nghiệm', 'Thử nghiệm', 'Thử nghiệm', 'Thử nghiệm' và. al.

Nhưng 'minimal_english' sẽ chỉ mang lại - 'Kiểm tra' và 'Kiểm tra'.

+2

Câu trả lời của bạn không được đánh dấu chính xác vì nó đến muộn hơn lần đầu tiên, nhưng điều này rõ ràng là giải pháp tốt hơn nhiều. phân tích quả cầu tuyết là khủng khiếp không chính xác. porterStem tốt hơn một chút và có thể sử dụng được. kstem thậm chí còn ít nhạy cảm hơn và minimal_english là ít nhạy cảm nhất. Nhưng quả cầu tuyết là khủng khiếp. –

+2

Tôi không thể tìm thấy minimal_english .. – Sekai

+0

@Sekai trong mã java minimal_english của bạn có thể được nhập từ org.apache.lucene.analysis.en.EnglishMinimalStemFilter và để sử dụng trong truy vấn, nó sẽ là "filter: minimal_english" –

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