Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案。这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常。指望用户在输入关键词时能够理解Lucene查询语法并始终能输入完美的查询表达式,这显然是不合理的。这意味着,Lucene查询解析器在许多搜索应用中对用户不够友好。
Lucene查询解析器的另一个缺点是它不能默认搜索多个字段。df参数定义了查询解析器默认搜索哪个字段,但是如果想要以不同权重对多个字段进行搜索时,就必须先对查询进行预处理。对大多数Solr开发人员来说,这样的查询预处理工作量过大。为了将用户查询直接传入Solr并优雅地进行处理,扩展的析取最大化查询解析器eDisMax应运而生。
二.eDisMax查询解析器概述eDisMax查询解析器实际上是由Lucene查询解析器和DisMax查询解析器组成。DisMax查询解析器是eDisMax查询解析器的旧版本,只接受关键词和少数几个基本的布尔运算,允许在多个字段中搜索关键词。因为DisMax查询解析器是eDisMax查询解析器的一个子集,所有不建议使用原始的DisMax查询解析器。
虽然eDisMax查询解析器不是Solr的默认查询解析器,但它具有查询语法容错性,不像Lucene查询解析器那样严格。
三.eDisMax查询参数eDisMax查询解析器支持Lucene查询解析器的所有查询语法。它们之间只有一个明显差异,eDisMax的输入语法不会抛出异常,而是将无效的输入作为文本字符串进行搜索。它还在语法解析上具有一定的容错性,支持特殊关键词。例如,可以理解小写转换后的AND和OR。这种灵活性和容错性让它比Lucene查询解析器更适合处理用户输入。
四.搜索多个字段
除了安全地处理用户输入文本和自由地解析查询语法,eDisMax查询解析器最有用的一个功能是对多个字段进行搜索。eDisMax查询解析器会将每个内容放在各自的字段中。通过指定查询和查询字段。例如:
q=solr in action&qf=title description author
另外,还可以根据意愿在每个查询基础上调整权重。
q=solr in action&qf=title^1.5 description author^3
五.查询与短语权重调整
eDisMax查询解析器的一个重要功能是调整彼此邻近的词项的相关度。使用Lucene查询解析器的典型查询,不管词项是否彼此邻近,或是否视为一个短语,所有词项的相关度都是一样的。eDisMax查询解析器的另一个功能是,对独立于用户主查询的函数进行任意地相关度调整。
1.pf【短语字段】、pf2和pf3参数pf参数用于调整那些q参数中所有词项彼此非常靠近的文档得分。pf参数与qf参数使用相同的格式,获取字段列表及可选的相应权重。eDisMax查询解析器尝试对q参数中所有词项进行短语查询,如果能在任何短语字段中找到确切的短语,则对匹配的文档调整相应的权重。
除了pf参数,eDisMax查询解析器还支持pf2和pf3参数。这些参数功能与pf参数类似,不过不需要q参数中所有词项,它们将词项分解为二元【pf2】或三元【pf3】,只对包含少量词项的文档调整权重。例如:在查询Solr finds relevant documents中,pf3参数会对包含短语"solr finds relevant" 或 "finds relevant documents"的文档调整权重。pf2与之类似,对包含其中任意两个连续词短语的文档进行权重调整。
2.ps【短语间隔】、ps2和ps3参数使用pf参数时,可能不希望查询中的所有词项作为一个精确的短语出现。使用ps参数可以指定查询中的词项间隔位置界限,以此在短语字段上判断匹配情况。eDisMax查询解析器还支持ps2和ps3参数,允许为ps2和ps3修改短语间隔值。不明确指定时默认为ps参数。
3.qs【查询短语间隔】参数qs参数对用户在主查询q参数上明确指定短语的处理方式类似。将qs参数视为重新定义要匹配的确切内容,可以将间隔默认值为0修改为更高的数值。
4.tie【决胜局】参数当查询的词项与文档的多个字段匹配时,tie参数可以决定如何处理这种情况。为匹配到的每个字段的每个词项计算其相关度得分,默认情况下,每个文档中得分最高的字段用于该词项的相关度计算。这是析取的最大得分,也是该查询解析器得名“析取最大值”的原因所在。这与Lucene查询解析器形成鲜明对比,Lucene查询解析器通常将每个字段的每个词项的相关度得分相加,计算出每个文档的综合相关度得分。