Solr 自定义排序[1]
需求:商品排序,无库存的商品排在后面(排序)。
搜索:
默认搜索: df:

可以看出左图第1个、第6个库存为0.
现在的需求是想将这两个库存为0的商品排在最后面。
edismax-》bf:product(map(store,1,9999999,1),100) ,效果如右图。
store map的规则:
store=0,v(store)=0;
store>0,v(store)=1;(默认store的最大值999999999)
product*100,为了突显加权的效果。(可忽略)
以上等同于:
q: queryStr_val_:"product(map(store,1,9999999,1),100)"
观察打分的细节:
<str name="92011786">
12.634275 = (MATCH) sum of:
2.0679202 = (MATCH) sum of:
1.2457463 = (MATCH) weight(searchField:165 in 18377) [DefaultSimilarity], result of:
1.2457463 = score(doc=18377,freq=2.0 = termFreq=2.0
), product of:
0.77180904 = queryWeight, product of:
7.3044024 = idf(docFreq=78, maxDocs=43211)
0.105663545 = queryNorm
1.6140602 = fieldWeight in 18377, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
7.3044024 = idf(docFreq=78, maxDocs=43211)
0.15625 = fieldNorm(doc=18377)
0.82217383 = (MATCH) weight(searchField:清爽 in 18377) [DefaultSimilarity], result of:
0.82217383 = score(doc=18377,freq=2.0 = termFreq=2.0
), product of:
0.6270135 = queryWeight, product of:
5.934057 = idf(docFreq=310, maxDocs=43211)
0.105663545 = queryNorm
1.3112538 = fieldWeight in 18377, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = termFreq=2.0
5.934057 = idf(docFreq=310, maxDocs=43211)
0.15625 = fieldNorm(doc=18377)
10.566355 = (MATCH) FunctionQuery(product(map(int(store),1.0,9999999.0,const(1)),const(100))), product of:
100.0 = product(map(int(store)=10,min=1.0,max=9999999.0,target=const(1)),const(100))
1.0 = boost
0.105663545 = queryNorm
</str>
从上可以大致看出总分12.634275为文本分2.0679202加上库存加分10.566355。
扩展阅读:
http://wiki.apache.org/solr/DisMax
DisMax is an abbreviation Disjunction Max, and is a popular query mode with Solr.
Simply put, it's your choice for all user generated queries.
Out of the box, Solr uses the standard Solr query parser which is pretty stupid, understanding only syntactically correct boolean queries like "title:foo OR body:foo", it can only search one field by default, and it may very well throw an exception in your face if you put in some characters it does not like.
Therefore a new, more robust query mode was needed and the DisMax and ExtendedDisMax Query Parsers were born. They are designed to process simple user entered phrases (without heavy syntax) and search for the individual words across several fields using different weighting (boosts) based on the significance of each field, and it should never throw an exception.
Disjunction refers to the fact that your search is executed across multiple fields, e.g. title, body and keywords, with different relevance weights
Max means that if your word "foo" matches both title and body, the max score of these two (probably title match) is added to the score, not the sum of the two as a simple OR query would do. This gives more control over your ranking.
DisMax is usually the short name for the actual query parser, so don't be confused. The old DisMax parser has been around for some time, while the new and more advanced ExtendedDisMax parser was introduced in
Solr3.1 as experimental.
There is a Lucid Imagination Blog post that explains the origins and conceptual behavior of dismax functionality.
FunctionQuery:
http://wiki.apache.org/solr/FunctionQuery#map
ExtendedDisMax[edisMax]:
http://wiki.apache.org/solr/ExtendedDisMax
Solr 自定义排序[1]的更多相关文章
- solr特点三: 基于Solr实现排序定制化参考
排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- DataTable自定义排序
使用JQ DataTable 的时候,希望某列数据可以进行自定义排序,操作如下:(以中文排序和百分比排序为例) 1:定义排序类型: //百分率排序 jQuery.fn.dataTableExt.oSo ...
- 干货之UICollectionViewFlowLayout自定义排序和拖拽手势
使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...
- DataGridView 绑定List集合后实现自定义排序
这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- mysql如何用order by 自定义排序
mysql如何用order by 自定义排序 id name roleId aaa bbb ccc ddd eee ,MySQL可以通过field()函数自定义排序,格式:field(value,st ...
- python 自定义排序函数
自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 ...
- 定制对ArrayList的sort方法的自定义排序
java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...
随机推荐
- Wifi设备接入流程
这是硬件平台下文档结构图,详细了解戳这里具体了解这里. 什么意思呢?要想实现控制wifi设备,基本流程是: 咱自己的wifi设备----------自己的服务器(指图中的厂商服务器)-------微信 ...
- XML中DTD,XSD的区别与应用
XML我们并不陌生,在企业级应用中有很广的用途.具体就不再说,下面介绍一下DTD,XSD的区别并以XSD为例看spring中定义与使用.1.DTD(Documnet Type Definition)D ...
- NCPC 2016:简单题解
A .Artwork pro:给定N*M的白色格子,然后Q次黑棒,输出每次加黑棒后白色连通块的数量.(N,M<1e3, Q<1e4) sol:倒着离线做,并查集即可. (在线做法:http ...
- Codeforces Round #519
题目链接:传送门 A. Elections (思维+暴力) 思路: 从最小的k开始枚举就好了- -. #include <bits/stdc++.h> using namespace ...
- lesson4-图像分类-小象cv
CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...
- linux通过安装包安装nginx和jdk
1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...
- acm 2001
格式化输出 //////////////////////////////////////////////////////////////////////////////// #include<i ...
- php基础-5
php的面相对象 <?php class Hello { public function say_hello() { echo "hello"; } } $say = ne ...
- (18)模型层 -ORM之msql 多表操作(字段的属性)
数据库表的对应关系 1.一对一 #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多 #关系确立,关联字段写在多的一方 3.多对多 #多对多的关系 ...
- linux kernel笔记
文章目录 关于linux内核中的__attribute__关键字 Linux kernel启动参数 gdt / ldt PCB 关于linux内核中的__attribute__关键字 part I: ...