2013-02-09 23 views
6

Trong tìm kiếm đàn hồi, bộ lọc nàyElasticSearch Bool Lọc với một cụm từ (thay vì một từ duy nhất/thẻ)

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google" 
     } 
    } 
    } 
} 

đúng trả về bài báo với "google" trong tiêu đề.

Tuy nhiên,

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google earth" 
     } 
    } 
    } 
} 

Không trả lại bất kỳ kết quả, mặc dù thực tế rằng có những bài viết với những từ chính xác "google earth" trong tiêu đề. Tôi muốn nó làm như vậy.

Truy vấn đầy đủ:

{ 
    "size": 200, 
    "filter": { 
    "bool": { 
     "must": { 
     "term": { 
      "article.title": "google maps" 
     } 
     } 
    } 
    }, 
    { 
    "range": { 
     "created_date": { 
     "from": "2013-01-11T02:14:03.352Z" 
     } 
    } 
    }] 
} 
} 

Như bạn thấy, tôi không có một "truy vấn" - chỉ là một bộ lọc, kích thước, và phạm vi. Vậy tôi lấy nó là ElasticSearch đang sử dụng trình phân tích mặc định ...?

Tôi hiểu lầm điều gì?


EDIT: Đối với những người tìm kiếm các giải pháp, đây là bộ lọc của tôi:

{ 
    "query": { 
    "bool": { 
     "must": { 
     "must_match": { 
      "article.title": "google earth" 
     } 
     } 
    } 
    } 
} 

Node rằng (1), chúng tôi được bao bọc bộ lọc bool với "truy vấn" và (2) " cụm từ "thay đổi thành" must_match ", khiến toàn bộ cụm từ được đối sánh (trái ngược với" đối sánh "sẽ tìm kiếm article.title với một bộ phân tích chuẩn trên google earth).

Truy vấn đầy đủ trông như thế này:

{ 
    "size": 200, 
    "filter": { 
    "query": { 
     "bool": { 
     "must": { 
      "must_match": { 
      "article.title": "google earth" 
      } 
     } 
     } 
    } 
    } 
} 

FWIW, lý do tôi có tình trạng này trong lĩnh vực "bộ lọc" (như trái ngược với cách sử dụng một truy vấn chuẩn) là đôi khi tôi muốn sử dụng một " must_not "thay vì" must_not "và đôi khi tôi cũng thêm các phần tử khác vào truy vấn.

+0

Trình phân tích của bạn trông như thế nào đối với article.title? Nếu bạn đang phân tích trường với bất kỳ điều gì khác ngoài "Từ khóa", trường đó sẽ được mã hóa thành [google] và [earth], trường sẽ không khớp với từ khóa. – Zach

+0

Hm, là bài viết từ truy vấn được chuyển sang bộ lọc? Tôi đã cập nhật câu hỏi của mình để minh họa ý tôi. –

Trả lời

9

Elasticsearch không sử dụng máy phân tích nào cả, vì bạn đã sử dụng term query, tìm kiếm các cụm từ chính xác.

Trường title IS được phân tích (trừ khi bạn đã chỉ định khác), vì vậy "google earth" sẽ được lập chỉ mục làm hai cụm từ ["google","earth"]. Đó là lý do tại sao truy vấn term cho các tác phẩm "google" hoạt động, nhưng truy vấn term cho "google earth" thì không - thuật ngữ EXACT đó không tồn tại.

Nếu bạn sử dụng match query thay vào đó, cụm từ truy vấn của bạn sẽ được phân tích trước khi tìm kiếm.

0

Đối với những vấp ngã trên này gần đây hơn, lưu ý rằng một cách ngắn gọn hơn để đại diện cho

{"query":{"bool":{"must":{"must_match":{"article.title":"google earth"}}}}} 

là với

{"query":{"match_phrase":{"article.title":"google earth"}}} 
0

tôi giải quyết điều này bằng cách nổ cụm từ trôi qua, vì vậy chỉ cần thay đổi.

{"bool":{"must":{"term":{"article.title":"google earth"}}}} 

để

{"bool":{"must":{"term":{"article.title":["google", "earth"]}}}} 

Nó không đẹp và có thể là quá chậm nếu bạn có rất nhiều thắc mắc xảy ra, nhưng nó hoạt động.

LƯU Ý, tôi vừa phát hiện ra điều này cũng sẽ trả về bất kỳ kết quả nào có "google" hoặc "trái đất". .

0

Sử dụng Elasticsearch 5.4.2, giải pháp của tôi phát triển là sau một:

{"query": { 
    "bool": { 
     "must": { 
      "match_phrase": { 
       "article.title": "google earth"}}}}} 

Hope this helps một ai đó.

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