Lucene-7.5.0 icon indicating copy to clipboard operation
Lucene-7.5.0 copied to clipboard

请问大佬,如何将Lucene query string直接转为Query对象

Open 1Yangc opened this issue 2 years ago • 8 comments

我试了一下QueryPharser对象需要传入一个field域,但是我不知道我的string里面有什么域,可能有一个,也有可能有几个field,还有可能是组合起来的类似于 +fieldA:F +(+(((fieldB:cd)^300.0 (fieldC:sc)^200.0 (fieldD:china)^100.0 +(((fieldA:[1663210081 TO 1663814881])^300.0 (fieldA:[1662605281 TO 1663814881])^200.0)~1))~1) +(((fieldA:[1663210081 TO 1663814881])^300.0 (fieldA:[1662605281 TO 1663814881])^200.0)~1))

如何转为一个Query对象放入lucene中去查呢? 请指教,谢谢大佬🙏

1Yangc avatar Sep 22 '22 04:09 1Yangc

你可以定义N个Query 然后用BooleanQuery封装这N个Query

LuXugang avatar Sep 22 '22 05:09 LuXugang

感谢大佬回复,可能是我没有描述太清楚。 上面这个query string就是我用BooleanQuery层层嵌套其他类型的Query然后tostring()出来的 然后想把它再转回去,但是每次toString出来的不一定一样,想问一下有没有其他方法转回去

1Yangc avatar Sep 22 '22 05:09 1Yangc

主要是我想传输这个String,到另一个服务上去解析为Query对象

1Yangc avatar Sep 22 '22 07:09 1Yangc

主要是我想传输这个String,到另一个服务上去解析为Query对象

你这个需求 我不知道Lucene有没有对应的功能解决😅 没法帮到你哦

要不你发邮件[email protected]问问Lucene的其他维护者吧

LuXugang avatar Sep 22 '22 08:09 LuXugang

不影响呀,那个只是默认的filed,如果你string里面有 fieldA:xx这种语法,它会把fieldA解析出来作为term(field, text)里面的filed

limitAp avatar Sep 22 '22 14:09 limitAp

举个栗子, a && name:b 默认field为content 用QueryParser转回去时候 => +content:a +name:b => BooleanQuery MUST term query(content, a) MUST term query(name, b)。

limitAp avatar Sep 22 '22 14:09 limitAp

不影响呀,那个只是默认的filed,如果你string里面有 fieldA:xx这种语法,它会把fieldA解析出来作为term(field, text)里面的filed

这个我了解,但是在复杂的嵌套语句中,比如BooleanQuery里面嵌套了BooleanQuery,BoostQuery,RangeQuery等,QueryParser解析的时候就会报错,这种时候我猜可能可以用不同的Analyzer,但是官方就只实现了一两种,好像不太行

1Yangc avatar Sep 22 '22 15:09 1Yangc

我试了一下QueryPharser对象需要传入一个field域,但是我不知道我的string里面有什么域,可能有一个,也有可能有几个field,还有可能是组合起来的类似于 +fieldA:F +(+(((fieldB:cd)^300.0 (fieldC:sc)^200.0 (fieldD:china)^100.0 +(((fieldA:[1663210081 TO 1663814881])^300.0 (fieldA:[1662605281 TO 1663814881])^200.0)~1))~1) +(((fieldA:[1663210081 TO 1663814881])^300.0 (fieldA:[1662605281 TO 1663814881])^200.0)~1))

如何转为一个Query对象放入lucene中去查呢? 请指教,谢谢大佬🙏

我好像发现问题了,在上面这一串字符中,如果我把 ~1 这个去掉就可以解析出来,这个~1是BooleanQuery中

if (getMinimumNumberShouldMatch() > 0) {
      buffer.append('~');
      buffer.append(getMinimumNumberShouldMatch());
    }

生成出来的,但是我的查询中又需要setMinimumNumberShouldMatch(1),感觉没啥好办法了

1Yangc avatar Sep 22 '22 15:09 1Yangc