2011-11-05 41 views
27

Bài kiểm tra đơn vị/tích hợp của tôi đơn vị/tích hợp bao gồm các thử nghiệm cho chức năng tìm kiếm.Làm cách nào để xóa chỉ mục ElasticSearch?

Ý tưởng của tôi là có chỉ mục tìm kiếm trống trước mỗi bài kiểm tra. Vì vậy, tôi đang cố gắng để loại bỏ tất cả các yếu tố trong chỉ mục trên setup phương pháp (nó là mã Groovy):

Client client = searchConnection.client 

SearchResponse response = client.prepareSearch("item") 
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
    .setQuery(termQuery('name', 'test')) //tried also matchAllQuery() 
    .setFrom(0).setSize(100).setExplain(false).execute().actionGet() 

List<String> ids = response.hits.hits.collect { 
    return it.id 
} 
client.close() 

client = searchConnection.client 

ids.each { 
    DeleteResponse delete = client.prepareDelete("item", "item", it) 
     .setOperationThreaded(false) 
     .execute().actionGet() 
} 

client.close() 

Có vẻ như là nó xử lý tất cả xóa không đồng bộ, vì vậy tôi đã thêm Thread.sleep(5000) sau nó. Như bạn thấy tôi đang cố gắng để mở/đóng kết nối vài lần - nó không giúp đỡ ở đó.

Vấn đề đôi khi cần nhiều thời gian hơn, đôi khi cần thêm 5 giây để xóa, đôi khi nó không thể tìm thấy dữ liệu bổ sung (từ thử nghiệm trước), v.v. . Đặt Thread.sleep() ở khắp mọi nơi, nơi có thể có vẻ như không phải là giải pháp tốt như vậy.

Có cách nào để cam kết thay đổi cuối cùng hoặc thực hiện khóa cho đến khi tất cả dữ liệu sẽ được ghi?

+0

Không cần phải gọi xả, chỉ cần gọi API làm mới để đảm bảo bạn có thể tìm kiếm trên dữ liệu được lập chỉ mục gần đây nhất. – kimchy

Trả lời

34

Tìm thấy giải pháp:

IndicesAdminClient adminClient = searchConnection.client.admin().indices(); 
String indexName = "location"; 
DeleteIndexResponse delete = adminClient.delete(new DeleteIndexRequest(indexName)).actionGet() 
if (!delete.isAcknowledged()) { 
    log.error("Index {} wasn't deleted", indexName); 
} 

client.admin().indices().flush(new FlushRequest('location')).actionGet(); 

sau khi đưa dữ liệu mới vào chỉ mục.

+0

Cảm ơn bạn .. Thư viện nào và bạn đã nhận được kết nối như thế nào? –

0

Ý tưởng của tôi là phải có chỉ mục tìm kiếm trống trước mỗi bài kiểm tra

Vì vậy, tạo ra một chỉ số mới vào lúc bắt đầu của thử nghiệm, không tái sử dụng cũ. Bạn được bảo đảm một sản phẩm nào sau đó. Trong teardown của bài kiểm tra, bạn có thể xóa chỉ mục kiểm tra.

Có cách nào để thực hiện thay đổi cuối cùng hoặc khóa cho đến khi tất cả dữ liệu sẽ được ghi không?

Không, ElasticSearch không có giao dịch hoặc khóa.

Nếu bạn không muốn tạo chỉ mục mới mỗi lần, sau đó thử thêm một vòng lặp kiểm tra xem chỉ mục có trống không, sau đó đợi và thử lại, cho đến khi nó được.

+0

Vâng, đó là những gì tôi đang tìm kiếm. Làm cách nào tôi có thể tạo chỉ mục mới? –

+0

@splix: http://www.elasticsearch.org/guide/reference/api/admin-indices-create-index.html – skaffman

5
  1. nó không phải là cuộc gọi async (bạn có thể thêm một người biết lắng nghe và tránh actionGet để có được những cuộc gọi async)
  2. xóa tất cả các mục thông qua:

    client.prepareDeleteByQuery(indexName). 
          setQuery(QueryBuilders.matchAllQuery()). 
          setTypes(indexType). 
          execute().actionGet(); 
    
  3. làm mới chỉ mục của bạn để xem thay đổi (chỉ bắt buộc trong các bài kiểm tra đơn vị)

+2

kiểm tra của tôi đã cho thấy rằng việc xóa tất cả các mục nhanh hơn sau đó tạo lại chỉ mục ... – Karussell

29

Trước hết bạn không phải xóa tất cả dữ liệu bằng cách phát hành xóa trên từng id tài liệu. Bạn chỉ có thể xóa tất cả dữ liệu với xóa theo truy vấn phù hợp với tất cả tài liệu http://www.elasticsearch.org/guide/reference/api/delete-by-query.html Có điều đó nói rằng tôi cũng không khuyên bạn nên làm như vậy, bởi vì nó không được khuyến cáo thực hiện thường xuyên trên các bộ sưu tập tài liệu lớn (xem tài liệu).

Những gì bạn thực sự muốn làm là xóa toàn bộ chỉ mục (nhanh) http://www.elasticsearch.org/guide/reference/api/admin-indices-delete-index.html, tạo lại, nhập dữ liệu và điều này là quan trọng làm mới chỉ mục để "cam kết" thay đổi và hiển thị chúng. http://www.elasticsearch.org/guide/reference/api/admin-indices-refresh.html

Tôi làm điều này trong các thử nghiệm của mình và không bao giờ gặp sự cố.

+8

Không có cần phải tuôn ra, chỉ cần gọi API làm mới để đảm bảo bạn tìm kiếm dữ liệu gần đây nhất. – kimchy

+0

Cảm ơn kimchy, đã cố định trong câu trả lời! – johno

+0

Liên kết không còn khả dụng nữa. – vdolez

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