我尝试使用特定的产品ID从我的索引中删除文档。
以下是示例代码:
package main
import (
"encoding/json"
"log"
"time"
"fmt"
"gopkg.in/mgo.v2/bson"
elastic "gopkg.in/olivere/elastic.v3"
)
func main() {
client, err := elastic.NewClient(elastic.SetSniff(false), elastic.SetURL("http://localhost:9200"))
if err != nil {
log.Fatal("Cannot create ES client:", err)
}
boolQuery := elastic.NewBoolQuery().Must(elastic.NewTermQuery("productId", "1503368"))
searchQuery := client.Search().Query(boolQuery).
Index("magento1").Type("catalog")
result, err := searchQuery.Do()
for _, hit := range result.Hits.Hits {
var data bson.M
_ = json.Unmarshal(*hit.Source, &data)
fmt.Println("SEARCH RESPONSE\n", data)
}
result2, err2 := elastic.NewDeleteByQueryService(client).
Index("magento1").
Type("catalog").
Query(boolQuery).
Do()
fmt.Println("DELETE RESPONSE 2: \n", result2, err2)
}
SearchQuery提供了正确的响应,并使用提供的productId返回给我文档(如果文档存在与否,我只能验证。)
现在删除,我不知道代码到底有什么问题,或者API中是否有任何遗漏或者必须添加额外内容(matchAll等)但是这个deleteQuery只是不删除索引,并始终给我回复:
error elastic: Error 404 (Not Found)
我搜索了所有博客/文档/官方图书馆的GitHub tests案例等,但没有一个解决了我的问题。虽然我已经解决了扫描/滚动和批量删除问题,但仍然想知道为什么如果它在官方文档中不起作用。
这是映射:
"productId": bson.M{"type": "string", "store": true, "index": "not_analyzed"},
ES版本:
5.3.1
感谢。
答案 0 :(得分:1)
问题来自于您使用elastic.v3
targets ES 2.x。
由于您使用的是ES 5.3.1,因此需要使用elastic.v5
,因此只需替换此行
elastic "gopkg.in/olivere/elastic.v3"
通过
elastic "gopkg.in/olivere/elastic.v5"
你应该没事。