代码同步
This commit is contained in:
parent
d1e2366a4d
commit
f1503b6490
121
es/es_search.go
121
es/es_search.go
@ -25,7 +25,7 @@ import (
|
|||||||
"github.com/elastic/go-elasticsearch/v8/esapi"
|
"github.com/elastic/go-elasticsearch/v8/esapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ESIndex = "books-from-mysql-v3"
|
const ESIndex = "books-from-mysql-v2"
|
||||||
|
|
||||||
// ESBookResponse 用于返回给Java客户端的格式,ID为简单的int64
|
// ESBookResponse 用于返回给Java客户端的格式,ID为简单的int64
|
||||||
type ESBookResponse struct {
|
type ESBookResponse struct {
|
||||||
@ -1545,7 +1545,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
"bookName": "book_name",
|
"bookName": "book_name",
|
||||||
"bookPic": "book_pic",
|
"bookPic": "book_pic",
|
||||||
"publication_times": "publication_time",
|
"publication_times": "publication_time",
|
||||||
"isSuit": "is_suit",
|
//"isSuit": "is_suit",
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== saleSelect 对应字段映射 =====
|
// ===== saleSelect 对应字段映射 =====
|
||||||
@ -1588,7 +1588,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 不作为查询条件的字段
|
// 不作为查询条件的字段
|
||||||
if key == "page" || key == "pageSize" || key == "per_page" || key == "saleSelect" || key == "picType" || key == "shopType" {
|
if key == "page" || key == "pageSize" || key == "per_page" || key == "saleSelect" || key == "picType" || key == "shopType" || key == "isSuit" || key == "is_return" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1610,7 +1610,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
key = nk
|
key = nk
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== is_suit =====
|
//TODO ===== is_suit =====
|
||||||
if key == "is_suit" {
|
if key == "is_suit" {
|
||||||
fmt.Printf("[DEBUG] is_suit val=%q\n", val)
|
fmt.Printf("[DEBUG] is_suit val=%q\n", val)
|
||||||
if num, err := strconv.Atoi(val); err == nil {
|
if num, err := strconv.Atoi(val); err == nil {
|
||||||
@ -1625,7 +1625,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== is_return =====
|
//TODO ===== is_return =====
|
||||||
if key == "is_return" {
|
if key == "is_return" {
|
||||||
fmt.Printf("[DEBUG] is_return val=%q\n", val)
|
fmt.Printf("[DEBUG] is_return val=%q\n", val)
|
||||||
if num, err := strconv.Atoi(val); err == nil {
|
if num, err := strconv.Atoi(val); err == nil {
|
||||||
@ -1678,6 +1678,35 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
"is_filter": pattern,
|
"is_filter": pattern,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if val == "2" {
|
||||||
|
cond = map[string]interface{}{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"should": []map[string]interface{}{
|
||||||
|
// 情况 1: is_filter 字段null
|
||||||
|
{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"must_not": []map[string]interface{}{
|
||||||
|
{"exists": map[string]interface{}{"field": "is_filter"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// 情况 2: is_filter 空串
|
||||||
|
{
|
||||||
|
"term": map[string]interface{}{
|
||||||
|
"is_filter": "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// 情况 3: is_filter 字段存在且匹配 wildcard 模式
|
||||||
|
{
|
||||||
|
"wildcard": map[string]interface{}{
|
||||||
|
"is_filter": pattern,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"minimum_should_match": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
must = append(must, cond)
|
must = append(must, cond)
|
||||||
fmt.Printf("[DEBUG] must += %v\n", cond)
|
fmt.Printf("[DEBUG] must += %v\n", cond)
|
||||||
@ -1812,6 +1841,32 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if minVal == 0 {
|
||||||
|
cond = map[string]interface{}{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"should": []map[string]interface{}{
|
||||||
|
// 情况 1: buy_counts 字段不存在或为 null
|
||||||
|
{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"must_not": []map[string]interface{}{
|
||||||
|
{"exists": map[string]interface{}{"field": "buy_counts"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// 情况 2: buy_counts 在范围内
|
||||||
|
{
|
||||||
|
"range": map[string]interface{}{
|
||||||
|
"buy_counts": map[string]interface{}{
|
||||||
|
"gte": minVal,
|
||||||
|
"lte": maxVal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"minimum_should_match": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
must = append(must, cond)
|
must = append(must, cond)
|
||||||
fmt.Printf("[DEBUG] must += %v\n", cond)
|
fmt.Printf("[DEBUG] must += %v\n", cond)
|
||||||
continue
|
continue
|
||||||
@ -1837,6 +1892,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
if len(parts) == 2 {
|
if len(parts) == 2 {
|
||||||
minVal, _ := strconv.Atoi(parts[0])
|
minVal, _ := strconv.Atoi(parts[0])
|
||||||
maxVal, _ := strconv.Atoi(parts[1])
|
maxVal, _ := strconv.Atoi(parts[1])
|
||||||
|
|
||||||
cond := map[string]interface{}{
|
cond := map[string]interface{}{
|
||||||
"range": map[string]interface{}{
|
"range": map[string]interface{}{
|
||||||
"total_sale": map[string]interface{}{
|
"total_sale": map[string]interface{}{
|
||||||
@ -1845,6 +1901,32 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if minVal == 0 {
|
||||||
|
cond = map[string]interface{}{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"should": []map[string]interface{}{
|
||||||
|
// 情况 1: total_sale 字段不存在或为 null
|
||||||
|
{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"must_not": []map[string]interface{}{
|
||||||
|
{"exists": map[string]interface{}{"field": "total_sale"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// 情况 2: total_sale 在范围内
|
||||||
|
{
|
||||||
|
"range": map[string]interface{}{
|
||||||
|
"total_sale": map[string]interface{}{
|
||||||
|
"gte": minVal,
|
||||||
|
"lte": maxVal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"minimum_should_match": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
must = append(must, cond)
|
must = append(must, cond)
|
||||||
fmt.Printf("[DEBUG] must += %v\n", cond)
|
fmt.Printf("[DEBUG] must += %v\n", cond)
|
||||||
continue
|
continue
|
||||||
@ -1870,6 +1952,32 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if minVal == 0 {
|
||||||
|
cond = map[string]interface{}{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"should": []map[string]interface{}{
|
||||||
|
// 情况 1: total_sale 字段不存在或为 null
|
||||||
|
{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"must_not": []map[string]interface{}{
|
||||||
|
{"exists": map[string]interface{}{"field": "total_sale"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// 情况 2: total_sale 在范围内
|
||||||
|
{
|
||||||
|
"range": map[string]interface{}{
|
||||||
|
key: map[string]interface{}{
|
||||||
|
"gte": minVal,
|
||||||
|
"lte": maxVal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"minimum_should_match": 1,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
must = append(must, cond)
|
must = append(must, cond)
|
||||||
fmt.Printf("[DEBUG] must += %v\n", cond)
|
fmt.Printf("[DEBUG] must += %v\n", cond)
|
||||||
continue
|
continue
|
||||||
@ -1902,6 +2010,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println("key--------------", key)
|
||||||
// ===== 默认前缀匹配 =====
|
// ===== 默认前缀匹配 =====
|
||||||
cond := map[string]interface{}{
|
cond := map[string]interface{}{
|
||||||
"prefix": map[string]interface{}{key: val},
|
"prefix": map[string]interface{}{key: val},
|
||||||
@ -1972,7 +2081,7 @@ func (svc *ESSearchService) BatchGetBookBaseInfoES(c *gin.Context) ([]ESBook, in
|
|||||||
|
|
||||||
res, duration, err := monitoredES.Search(context.Background(), &req)
|
res, duration, err := monitoredES.Search(context.Background(), &req)
|
||||||
|
|
||||||
fmt.Printf("[DEBUG] ES Query Response:\n%s\n", res)
|
//fmt.Printf("[DEBUG] ES Query Response:\n%s\n", res)
|
||||||
fmt.Printf("[DEBUG] ES 查询耗时:%dms\n", duration.Milliseconds())
|
fmt.Printf("[DEBUG] ES 查询耗时:%dms\n", duration.Milliseconds())
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
4
main.go
4
main.go
@ -185,9 +185,9 @@ func main() {
|
|||||||
//)
|
//)
|
||||||
/** ES2 本地测试 **/
|
/** ES2 本地测试 **/
|
||||||
esClient, err := es.NewESClient(
|
esClient, err := es.NewESClient(
|
||||||
[]string{"http://36.212.1.63:9200"},
|
[]string{"https://103.236.91.138:9200"},
|
||||||
"elastic",
|
"elastic",
|
||||||
"zDzSXel3PFwx9=6Ybmqv",
|
"7AYdoW=mn3yHZ*3A=Z1x",
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -11,8 +11,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/elastic/go-elasticsearch/v8/esapi"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
@ -20,6 +18,9 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/elastic/go-elasticsearch/v8/esapi"
|
||||||
|
jsoniter "github.com/json-iterator/go"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BookService 图书搜索服务
|
// BookService 图书搜索服务
|
||||||
@ -881,7 +882,7 @@ func (svc *BookService) SyncRedisByISBN(isbn string, act string) error {
|
|||||||
if book.PublicationTime != "" && book.PublicationTime != "0" {
|
if book.PublicationTime != "" && book.PublicationTime != "0" {
|
||||||
publicationTimeIn64, err := strconv.ParseInt(book.PublicationTime, 10, 64)
|
publicationTimeIn64, err := strconv.ParseInt(book.PublicationTime, 10, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
redisBookInfo.PublicationDate = time.Unix(publicationTimeIn64, 0).Format("2006-01")
|
redisBookInfo.PublicationDate = time.Unix(publicationTimeIn64+5364000000, 0).Format("2006-01")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if book.BindingLayout != "" {
|
if book.BindingLayout != "" {
|
||||||
@ -1420,12 +1421,40 @@ func (svc *BookService) buildBuyCountsCondition(builder *ESQueryBuilder, buyCoun
|
|||||||
if len(parts) == 2 {
|
if len(parts) == 2 {
|
||||||
minVal, _ := strconv.Atoi(parts[0])
|
minVal, _ := strconv.Atoi(parts[0])
|
||||||
maxVal, _ := strconv.Atoi(parts[1])
|
maxVal, _ := strconv.Atoi(parts[1])
|
||||||
|
// 如果查询范围包含 0(0-999999),需要同时匹配 null 值
|
||||||
|
if minVal == 0 {
|
||||||
|
// 使用 bool should 查询:匹配范围内值 OR 字段为 null/不存在
|
||||||
|
rangeQuery := map[string]interface{}{
|
||||||
|
"range": map[string]interface{}{
|
||||||
|
"buy_counts": map[string]interface{}{
|
||||||
|
"gte": minVal,
|
||||||
|
"lte": maxVal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
nullQuery := map[string]interface{}{
|
||||||
|
"bool": map[string]interface{}{
|
||||||
|
"must_not": []map[string]interface{}{
|
||||||
|
{
|
||||||
|
"exists": map[string]interface{}{
|
||||||
|
"field": "buy_counts",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.AddBoolQuery("should", []map[string]interface{}{rangeQuery, nullQuery})
|
||||||
|
} else {
|
||||||
|
// 普通范围查询,不包含 null 值
|
||||||
builder.AddQuery(&QueryCondition{
|
builder.AddQuery(&QueryCondition{
|
||||||
Field: saleField,
|
Field: saleField,
|
||||||
Type: "range",
|
Type: "range",
|
||||||
GTE: minVal,
|
GTE: minVal,
|
||||||
LTE: maxVal,
|
LTE: maxVal,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user