我试图让我的DSE搜索查询正常工作(使用Solr)。但是,在使用用户定义类型(UDT)构建查询时,我遇到了具有空白字符的问题。
例如:我有Student
表和Name
类型,其中Student
表有list<frozen<Name> names
。 Name
类型有firstname
和lastname
。如果我执行以下查询,则会抛出错误:
Unable to execute CQL Script : no field name specified in query and no default specified via ‘df’ param.
来自Student的SELECT * solr_query =&#39; {!tuple} names.firstname:John 史密斯&#39 ;;
所以我尝试了如下所示转义空白,它运行得很好。
来自Student的SELECT * solr_query =&#39; {!tuple} names.firstname:John \ 史密斯&#39 ;;
但是,当我使用带有AND运算符的上述UDT字段时,它再次失败。
来自学生的SELECT *,其中solr_query =&#39; student_id:123456 AND {!tuple} names.firstname:John \ 史密斯&#39 ;;
无法执行CQL脚本:org.apache.solr.search.SyntaxError:无法解析names.firstname ...第1行的Lexical错误,列...遇到:after:“”
这是名字的字段类型:
<fieldType class="org.apache.solr.schema.TextField" name="DelimitedTextField">
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="[,\s]"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
作为Solr的初学者,我一直在试图让这些查询起作用。任何帮助将深表感谢。谢谢!
答案 0 :(得分:0)
我不是你似乎正在使用的所有DSE系统的专家,但是看看这个资源[1],你似乎可能以错误的方式构建布尔查询。 这似乎是一种正确的方法:
+ {!tuple v ='father.name.firstname:Sam'} + {!tuple v ='mother.name.firstname:Anne'}
希望有所帮助
答案 1 :(得分:0)
通过做一些事情我能够做到这一点。
我创建了一个新的org.apache.solr.schema.TextField并添加了
PatternTokenizerFactory tokenizer,以逗号(,)作为模式。
在开头和结尾修剪白色空间,然后 用'?'替换文本中的空格哪个匹配任何 单个字符。在我的情况下这是可以的。
我必须在整个查询中添加大括号()。
因此,使用更新的schema.xml文件和上面提到的其他更改,我现在可以使用以下查询:
SELECT * from Student where solr_query ='(student_id:123456 AND names.firstname {元组!}:约翰史密斯)';
虽然这可以与约翰史密斯,约翰史密斯甚至约翰史密斯相匹敌,但在我的情况下这是好的,因为无论如何我们应该回馈这些结果。