go lucene
v0.0.20
依存関係のない go で書かれた lucene パーサー。
このパッケージを使用すると、lucene スタイルの検索をアプリ内にすばやく統合し、特定のクエリ用の SQL フィルターを生成できます。外部依存関係はなく、文法は Apache Lucene 9.4.2 を完全にサポートしています。
go-lucene はすぐに postgres 準拠の SQL 生成をサポートしますが、さまざまな種類の SQL (または SQL なし) もサポートするように拡張できます。
lucene.ToPostgres
を使用して、すべてのフィルターを含む単一の文字列を生成します。
lucene.ToParmeterizedPostgres
を使用して、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;
`
}