// try and build a query from the given params func (rp *rangeParams) generate() (bleve.Query, error) { if rp.min == nil && rp.max == nil { return nil, fmt.Errorf("empty range") } isNumeric, f1, f2 := rp.numericArgs() if isNumeric { return bleve.NewNumericRangeInclusiveQuery(f1, f2, rp.minInclusive, rp.maxInclusive), nil } isDate, t1, t2 := rp.dateArgs() if isDate { // we'll skip the whole daterange thing and go with the raw timestamp // relevant: https://github.com/blevesearch/bleve/issues/251 var fMin, fMax *float64 if rp.min != nil { foo1 := numeric_util.Int64ToFloat64(t1.UnixNano()) fMin = &foo1 } if rp.max != nil { foo2 := numeric_util.Int64ToFloat64(t2.UnixNano()) fMax = &foo2 } return bleve.NewNumericRangeInclusiveQuery(fMin, fMax, rp.minInclusive, rp.maxInclusive), nil } return nil, fmt.Errorf("not numeric") }
// try and build a query from the given params func (rp *rangeParams) generate() (query.Query, error) { if rp.min == nil && rp.max == nil { return nil, fmt.Errorf("empty range") } isNumeric, f1, f2 := rp.numericArgs() if isNumeric { return bleve.NewNumericRangeInclusiveQuery(f1, f2, rp.minInclusive, rp.maxInclusive), nil } isDate, t1, t2 := rp.dateArgs() if isDate { return bleve.NewDateRangeInclusiveQuery(t1, t2, rp.minInclusive, rp.maxInclusive), nil } return nil, fmt.Errorf("not numeric") }
func (pages *Pages) QueryNumberRangeInclusive(field string, start, end interface{}, startInc bool, endInc bool) *Pages { var fstart *float64 = nil var fend *float64 = nil if start != nil { if f, err := cast.ToFloat64E(start); err == nil { fstart = &f } } if end != nil { if f, err := cast.ToFloat64E(end); err == nil { fend = &f } } q := bleve.NewNumericRangeInclusiveQuery(fstart, fend, &startInc, &endInc) q.SetField(field) pages.queries = append(pages.queries, q) pages.clear() return pages }
func TestQuerySyntaxParserValid(t *testing.T) { fivePointOh := 5.0 onePointOh := 1.0 theTruth := true theFalsehood := false jan_01_2015 := numeric_util.Int64ToFloat64(time.Date(2015, time.January, 01, 0, 0, 0, 0, time.UTC).UnixNano()) jan_02_2015 := numeric_util.Int64ToFloat64(time.Date(2015, time.January, 02, 0, 0, 0, 0, time.UTC).UnixNano()) mar_15_2015 := numeric_util.Int64ToFloat64(time.Date(2015, time.March, 15, 0, 0, 0, 0, time.UTC).UnixNano()) mar_16_2015 := numeric_util.Int64ToFloat64(time.Date(2015, time.March, 16, 0, 0, 0, 0, time.UTC).UnixNano()) tests := []struct { input string result bleve.Query mapping *bleve.IndexMapping }{ { input: "test", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test"), }, { input: `"test phrase 1"`, mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test phrase 1"), }, { input: "field:test", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test").SetField("field"), }, // - is allowed inside a term, just not the start { input: "field:t-est", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("t-est").SetField("field"), }, // + is allowed inside a term, just not the start { input: "field:t+est", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("t+est").SetField("field"), }, // > is allowed inside a term, just not the start { input: "field:t>est", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("t>est").SetField("field"), }, // < is allowed inside a term, just not the start { input: "field:t<est", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("t<est").SetField("field"), }, // = is allowed inside a term, just not the start { input: "field:t=est", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("t=est").SetField("field"), }, { input: "+field1:test1", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test1").SetField("field1"), }, { input: "-field2:test2", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, nil, []bleve.Query{ bleve.NewMatchPhraseQuery("test2").SetField("field2"), }), }, { input: `field3:"test phrase 2"`, mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test phrase 2").SetField("field3"), }, { input: `+field4:"test phrase 1"`, mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test phrase 1").SetField("field4"), }, { input: `-field5:"test phrase 2"`, mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, nil, []bleve.Query{ bleve.NewMatchPhraseQuery("test phrase 2").SetField("field5"), }), }, { input: `+field6:test3 -field7:test4 field8:test5`, mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( []bleve.Query{ bleve.NewMatchPhraseQuery("test3").SetField("field6"), }, []bleve.Query{ bleve.NewMatchPhraseQuery("test5").SetField("field8"), }, []bleve.Query{ bleve.NewMatchPhraseQuery("test4").SetField("field7"), }), }, { input: "test^3", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("test").SetBoost(3.0), }, { input: "test^3 other^6", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchPhraseQuery("test").SetBoost(3.0), bleve.NewMatchPhraseQuery("other").SetBoost(6.0), }, nil, ), }, { input: "33", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("33"), }, { input: "field:33", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("33").SetField("field"), }, { input: "cat-dog", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("cat-dog"), }, /* // TODO: MatchPhraseQuery doesn't handle fuzziness... { input: "watex~", mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("watex").SetFuzziness(1), }, { input: "watex~2", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchQuery("watex").SetFuzziness(2), }, nil), }, { input: "watex~ 2", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchQuery("watex").SetFuzziness(1), bleve.NewMatchQuery("2"), }, nil), }, { input: "field:watex~", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchQuery("watex").SetFuzziness(1).SetField("field"), }, nil), }, { input: "field:watex~2", mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchQuery("watex").SetFuzziness(2).SetField("field"), }, nil), }, */ { input: `field:555c3bb06f7a127cda000005`, mapping: NewIndexMapping(), result: bleve.NewMatchPhraseQuery("555c3bb06f7a127cda000005").SetField("field"), }, { input: `field:>5`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&fivePointOh, nil, &theFalsehood, nil).SetField("field"), }, { input: `field:>=5`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&fivePointOh, nil, &theTruth, nil).SetField("field"), }, { input: `field:<5`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(nil, &fivePointOh, nil, &theFalsehood).SetField("field"), }, { input: `field:<=5`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(nil, &fivePointOh, nil, &theTruth).SetField("field"), }, { input: `grapefruit AND lemon`, mapping: NewIndexMapping(), result: bleve.NewConjunctionQuery([]bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit"), bleve.NewMatchPhraseQuery("lemon"), }), }, { input: `grapefruit OR lemon`, mapping: NewIndexMapping(), result: bleve.NewDisjunctionQuery([]bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit"), bleve.NewMatchPhraseQuery("lemon"), }), }, { // default operator is OR input: `grapefruit lemon`, mapping: NewIndexMapping(), result: bleve.NewBooleanQuery( nil, []bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit"), bleve.NewMatchPhraseQuery("lemon"), }, nil, ), }, { input: `grapefruit AND NOT lemon`, mapping: NewIndexMapping(), result: bleve.NewConjunctionQuery([]bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit"), bleve.NewBooleanQuery(nil, nil, []bleve.Query{bleve.NewMatchPhraseQuery("lemon")}), }), }, { input: `field:(grapefruit AND lemon)`, mapping: NewIndexMapping(), result: bleve.NewConjunctionQuery([]bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit").SetField("field"), bleve.NewMatchPhraseQuery("lemon").SetField("field"), }), }, { input: `-field:(grapefruit AND lemon)`, mapping: NewIndexMapping(), result: bleve.NewBooleanQuery(nil, nil, []bleve.Query{ bleve.NewConjunctionQuery([]bleve.Query{ bleve.NewMatchPhraseQuery("grapefruit").SetField("field"), bleve.NewMatchPhraseQuery("lemon").SetField("field"), }), }), }, { input: `shoesize:[1 TO 5]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&onePointOh, &fivePointOh, &theTruth, &theTruth).SetField("shoesize"), }, { input: `shoesize:{1 TO 5}`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&onePointOh, &fivePointOh, &theFalsehood, &theFalsehood).SetField("shoesize"), }, { input: `shoesize:[1 TO 5}`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&onePointOh, &fivePointOh, &theTruth, &theFalsehood).SetField("shoesize"), }, { input: `shoesize:{1 TO 5]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&onePointOh, &fivePointOh, &theFalsehood, &theTruth).SetField("shoesize"), }, { input: `shoesize:[ TO 5]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(nil, &fivePointOh, nil, &theTruth).SetField("shoesize"), }, { input: `shoesize:[1 TO ]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&onePointOh, nil, &theTruth, nil).SetField("shoesize"), }, // date ranges (note that endpoints and inclusivity might be modified by the parser) { input: `when:[2015-01-01 TO 2015-03-15]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&jan_01_2015, &mar_16_2015, &theTruth, &theFalsehood).SetField("when"), }, { input: `when:{2015-01-01 TO 2015-03-15]`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&jan_02_2015, &mar_16_2015, &theTruth, &theFalsehood).SetField("when"), }, { input: `when:[2015-01-01 TO 2015-03-15}`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&jan_01_2015, &mar_15_2015, &theTruth, &theFalsehood).SetField("when"), }, { input: `when:>2015-03-15`, mapping: NewIndexMapping(), result: bleve.NewNumericRangeInclusiveQuery(&mar_16_2015, nil, &theTruth, nil).SetField("when"), }, } for _, test := range tests { q, err := Parse(test.input) if err != nil { t.Error(err) } if !reflect.DeepEqual(q, test.result) { t.Errorf("Expected %#v, got %#v: for `%s`", test.result, q, test.input) // t.Errorf("Expected %#v, got %#v: for %s", test.result.(*booleanQuery).Should.(*disjunctionQuery).Disjuncts[0], q.(*booleanQuery).Should.(*disjunctionQuery).Disjuncts[0], test.input) } } }
func getJobSearchRequest(r *http.Request) (*bleve.SearchRequest, error) { musts := []query.Query{} // mustNots := []query.Query{} // shoulds := []query.Query{} tagShoulds := []query.Query{} for _, tag := range r.URL.Query()["tags"] { tagShoulds = append(tagShoulds, bleve.NewMatchQuery(tag)) } if len(tagShoulds) > 0 { booleanQuery := bleve.NewBooleanQuery() booleanQuery.AddShould(tagShoulds...) musts = append(musts, booleanQuery) } value1 := 0.0 if len(r.URL.Query().Get("price_from")) != 0 { intValue1, err := strconv.ParseInt(r.URL.Query().Get("price_from"), 10, 64) if err != nil { return nil, err } value1 = float64(intValue1) } value2 := math.MaxFloat64 if len(r.URL.Query().Get("price_to")) != 0 { intValue2, err := strconv.ParseInt(r.URL.Query().Get("price_to"), 10, 64) if err != nil { return nil, err } value2 = float64(intValue2) } inclusiveValue1 := true inclusiveValue2 := false numericRangeIncludiveQuery := bleve.NewNumericRangeInclusiveQuery( &value1, &value2, &inclusiveValue1, &inclusiveValue2, ) numericRangeIncludiveQuery.SetField("price") musts = append(musts, numericRangeIncludiveQuery) period := int64(30) if len(r.URL.Query().Get("period")) != 0 { periodTemp, err := strconv.ParseInt(r.URL.Query().Get("period"), 10, 64) if err != nil { return nil, err } if periodTemp > 0 && periodTemp <= 365 { period = periodTemp } } now := time.Now() dateTo := time.Now().Add(time.Duration(24*period) * time.Hour) dateRangeQuery := bleve.NewDateRangeQuery(now, dateTo) dateRangeQuery.SetField("startDate") musts = append(musts, dateRangeQuery) query := bleve.NewBooleanQuery() query.AddMust(musts...) // query.AddMustNot(mustNots...) // query.AddShould(shoulds...) searchRequest := bleve.NewSearchRequest(query) searchRequest.Fields = []string{"*"} return searchRequest, nil }