2013-01-15 28 views
7

Chúng tôi đang chạy ElasticSearch và đang gặp một số sự cố khi tìm kiếm cụm từ chứa khoảng trắng. Một ví dụ cụ thể: có một người tên là JM Bruno, nhưng khi tìm kiếm kết quả này thì không có kết quả nào được trả về. Tôi mơ hồ nhớ rằng tìm kiếm cụm từ chính xác này đã trả về kết quả, nhưng tôi không thể tái sản xuất ngay bây giờ.Tìm kiếm theo cụm từ có khoảng trắng

Tôi đã thử thêm khoảng trắng cũng như "\" vào mẫu mã thông báo của tôi, không có nhiều may mắn. Các cài đặt ES là như sau (sử dụng đá quý Lốp trong ứng dụng Ruby on Rails)

module Search 
def self.included base 
base.send :include, Tire::Model::Search 
base.send :include, Tire::Model::Callbacks 

base.class_eval do 
    settings analysis: { 
       filter: { 
       ngram: { 
        type: 'nGram', 
        max_gram: 12, 
        min_gram: 3 
       }, 
       url_stop: { 
        type: "stop", 
        stopwords: %w[http https] 
       } 
       }, 
       tokenizer: { 
       url_email_tokenizer: { 
        pattern: '[^\w\-\[email protected]]+', 
        type: 'pattern' 
       } 
       }, 
       analyzer: { 
       url_analyzer: { 
        tokenizer: "url_email_tokenizer", 
        filter: %w[url_stop ngram], 
        type: "custom" 
       }, 
       name_analyzer: { 
        tokenizer: 'url_email_tokenizer', 
        filter: 'ngram', 
        type: 'custom' 
       } 
       } 
      } 


    end 
    end 
end 

Chúng tôi sử dụng các mã thông báo này để tìm kiếm tên miền và địa chỉ email.

Trả lời

3

Cố gắng chạy _analyze API bằng máy phân tích bạn đã áp dụng cho trường của mình.

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno' 

Bạn sẽ thấy cách Elasticsearch phá vỡ nội dung trường của bạn thành mã thông báo và lý do bạn không thể tìm kiếm bằng cách sử dụng TermQuery. Một TermQuery không được phân tích để nó so sánh truy vấn của bạn chính xác như với chỉ số đảo ngược.

+0

nó sẽ trả về một mã số 400 với lỗi 'không tìm thấy phân tích'. Không phải là ES nhận thức được những gì tôi sử dụng cho các thiết lập trong đá quý lốp khi nói đến phân tích? – HannesFostie

+0

Hãy thử MyModel.index.analyze "Văn bản của tôi", máy phân tích: "name_analyzer" – karmi

+0

đã tìm ra tôi cần thêm chỉ mục, nhưng phản hồi không có ý nghĩa nhiều với tôi. Chắc chắn, nó tìm thấy một loạt các thẻ như tôi mong đợi họ được tokenized bởi ngram, nhưng điều đó không giải thích tại sao nó không được bao gồm trong tìm kiếm (ít nhất, nó không rõ ràng với tôi) – HannesFostie

0

Tôi đã gặp sự cố tương tự và điều duy nhất tôi đưa ra là chỉ thay thế ký tự không gian bằng "?" ký tự đại diện. Nó trông giống như tokenizer mặc định cũng như một trong tôi đã được yêu cầu cụ thể trong tìm kiếm chuỗi truy vấn đã bị bỏ qua.

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