ตัวแยกวิเคราะห์ lucene เขียนโดยไม่มีการขึ้นต่อกัน
ด้วยแพ็คเกจนี้ คุณสามารถรวมการค้นหาสไตล์ lucene ภายในแอปของคุณได้อย่างรวดเร็ว และสร้างตัวกรอง sql สำหรับการสืบค้นเฉพาะ ไม่มีการพึ่งพาภายนอกและไวยากรณ์รองรับ Apache Lucene 9.4.2 อย่างสมบูรณ์
go-lucene รองรับการสร้าง sql ที่สอดคล้องกับ postgres นอกกรอบ แต่สามารถขยายเพื่อรองรับ sql รสชาติที่แตกต่างกัน (หรือไม่มี sql) ได้เช่นกัน
ใช้ lucene.ToPostgres
เพื่อสร้างสตริงเดี่ยวที่มีตัวกรองทั้งหมดของคุณอยู่ในนั้น
ใช้ lucene.ToParmeterizedPostgres
เพื่อสร้างสตริงที่กำหนดพารามิเตอร์ด้วย args ที่คุณสามารถส่งไปยังการสืบค้น DB ของคุณได้
ใช้ตัวเลือก lucene.WithDefaultField
เพื่อเชื่อมโยงตัวอักษรเปล่ากับฟิลด์
// suppose you want a query for red apples that are not honey crisp or granny smith and are older than 5 months old
myQuery := `color:red AND NOT (type:"honey crisp" OR type:"granny smith") AND age_in_months:[5 TO *]`
filter , err := lucene . ToPostgres ( myQuery )
if err != nil {
// handle error
}
SQLTemplate := `
SELECT *
FROM apples
WHERE %s
LIMIT 10;
`
sqlQuery := fmt . Sprintf ( SQLTemplate , filter )
// sqlQuery is:
`
SELECT *
FROM apples
WHERE
(
("color" = 'red') AND
(
NOT(
("type" = 'honey crisp') OR
("type" = 'granny smith')
)
)
) AND
("age_in_months" >= 5)
LIMIT 10;
`
// suppose you want a query for red apples that are not honey crisp or granny smith and are older than 5 months old
myQuery := `color:red AND NOT (type:"honey crisp" OR type:"granny smith") AND age_in_months:[5 TO *]`
filter , params , err := lucene . ToParameterizedPostgres ( myQuery )
if err != nil {
// handle error
}
SQLTemplate := `
SELECT *
FROM apples
WHERE %s
LIMIT 10;
`
sqlQuery := fmt . Sprintf ( SQLTemplate , filter )
db . Query ( sqlQuery , params )
myQuery := "red OR green"
filter , err := lucene . ToPostgres (
myQuery , lucene . WithDefaultField ( "appleColor" ))
if err != nil {
// handle error
}
SQLTemplate := `
SELECT *
FROM apples
WHERE %s
LIMIT 10;
`
sqlQuery := fmt . Sprintf ( SQLTemplate , filter )
// sqlQuery is:
`
SELECT *
FROM apples
WHERE
("appleColor" = 'red') OR ("appleColor" = 'green')
LIMIT 10;
`
เพียงฝังไดรเวอร์ Base
ไว้ในไดรเวอร์ที่คุณกำหนดเอง และแทนที่ RenderFN
ด้วยฟังก์ชันการเรนเดอร์ที่คุณกำหนดเอง
import (
"github.com/grindlemire/go-lucene"
"github.com/grindlemire/go-lucene/pkg/driver"
"github.com/grindlemire/go-lucene/pkg/lucene/expr"
)
type MyDriver struct {
driver. Base
}
// Suppose we want a customer driver that is postgres but uses "==" rather than "=" for an equality check.
func NewMyDriver () MyDriver {
// register your new custom render functions. Each render function
// takes a left and optionally right rendered string and returns the rendered
// output string for the entire expression.
fns := map [expr. Operator ]driver. RenderFN {
expr . Equals : myEquals ,
}
// iterate over the existing base render functions and swap out any that you want to
for op , sharedFN := range driver . Shared {
_ , found := fns [ op ]
if ! found {
fns [ op ] = sharedFN
}
}
// return the new driver ready to use
return MyDriver {
driver. Base {
RenderFNs : fns ,
},
}
}
// Suppose we wanted to implement equals using a "==" operator instead of "="
func myEquals ( left , right string ) ( string , error ) {
return left + " == " + right , nil
}
...
func main () {
// create a new instance of the driver
driver := NewMyDriver ()
// render an expression
expr , _ := lucene . Parse ( `color:red AND NOT (type:"honey crisp" OR type:"granny smith") AND age_in_months:[5 TO *]` )
filter , _ := driver . Render ( expr )
SQLTemplate := `
SELECT *
FROM apples
WHERE %s
LIMIT 10;
`
sqlQuery := fmt . Sprintf ( SQLTemplate , filter )
// sqlQuery is:
`
SELECT *
FROM apples
WHERE
(
("color" == 'red') AND
(
NOT(
("type" == 'honey crisp') OR
("type" == 'granny smith')
)
)
) AND
("age_in_months" >= 5)
LIMIT 10;
`
}