tie参数决定了最匹配的字段之外的其他字段的词项相关度得分有多少应该贡献给总体相关度得分。tie参数的默认值为0.0,这表示其它字段不贡献权重。当tie为1时,表示贡献全部权重,此时相关等同于Lucene查询解析器。在这种情况下,相关度评分使用的是析取和而不是析取最大值。
5.bq【提升查询】参数bq参数接受查询字符串,其包含在主查询q参数中,用来影响相关度得分。它不会影响匹配到的文档数,只影响文档返回的顺序。如果想为最近的文档提升相关度,可以在请求中添加一下内容:
bq=date:[NOW/DAY-1YEAR TO NOW/DAY]
这将有效提升日期属于去年的所有文档的相关度得分。另外,还可以指定多个bq参数,在查询解析时针对不同子句分别进行提升。
6.bf【提升函数】参数bf参数能够通过函数查询来提升主查询的相关度。例如,提升最新日期的文档的相关度:
recip(rord(date),1,1000,1000)
bf参数接受Solr支持的所有函数及其权重值。
六.字段别名有时候需要在Solr中使用内部字段名,这些字段名并不适合显示给用户。对于动态字段来说尤为如此,动态字段名可能类似title_t_en这样,但是我们希望在搜索中使用对用户更友好的语法,例如,title:"some title"。eDisMax查询解析器为此提供了字段别名机制。
eDisMax查询中的字段别名通过在请求中添加参数f.{alias}.qf={realfield}来实现。例如:
/select?defType=edismax&q=title:"some title"&f.title.qf=title_t_en
查询在title_t_en字段上执行,接下来它会被查询中出现的title字段替换。字段别名参数在默认的qf参数后使用,这意味着,可以将一个别名分别以不同的权重对应到多个内部字段。在请求中添加任意数量的别名也是可以的。
多别名字段的搜索类似于默认字段的搜索,其中每个查询词项被分布在别名定义的查询字段上。唯一的区别是可以为每个别名定义单独的qf字段,而不是为默认字段定义一个qf参数。因此,与每个别名相关的查询部分会对字段列表进行搜索。
七.可访问字段在许多情况下,用户只能对默认字段以及可能的一小部分其它字段进行关键词搜索。由于有些内部字段可能会包含某些敏感信息【例如,用户ID或其他内部标识符】,可能不希望用户从Solr索引中猜出其他字段并查询它们。
虽然eDisMax查询解析器允许主查询q参数对任何字段进行搜索,但也可以使用uf【用户字段】参数来加以限制。默认值是uf=*,允许用field:expression语法查询所有字段。如果要限制可用字段为单个title字段,指定uf=title即可。多字段的访问使用空格隔开:uf=title city date。如果要对用户禁用所有字段,则使用否定语法:uf=-*。如果要对指定字段列表之外的其他字段进行访问,则使用uf=* -hiddenField1 -hiddenField2...
为确保完全控制用户查询,可以将uf参数和字段别名参数结合使用。uf参数既接受真实字段,也接受别名。这样设置可以保护搜索引擎不访问未经授权的字段。
八.最小匹配在布尔逻辑中使用二元运算符:AND和OR。它们是Lucene对必须匹配和应该匹配的内部表达形式。查询表达式hello AND world可以改写为+hello +world,这表示hello和world都必须匹配。OR用法于此类似,表示此中存在匹配的即可。
eDisMax查询解析器通过mm【最小匹配】参数模糊了传统布尔逻辑的界限。为了让文档实现匹配,mm参数在查询中可以定义必须匹配的特定数量的词项或词项的百分比。这是对搜索应用的查准率与查全率进行操作的一个好方式。原因在于,它不要求所有词项必须匹配【默认运算符为AND】或仅需要匹配其中一个词项即可【默认运算符为OR】。
mm参数语法非常丰富,很难一下子掌握。例如:
mm可以定义必须匹配的表达式数量【正整数】、遗漏的表达式数量【负整数】、必须匹配的表达式百分比【正百分比】以及遗漏的表达式百分比【负百分比】。要进一步控制的话,根据查询中现有的表达式数量,可以定义不同的最小匹配规则。以下面的查询结构为例:
/select?q={!edismax mm="2<50% 4<-45%" v=$example}&example=...
对于该查询,以下规则将对不同的示例参数值生效: