【Apache Solr系列】Solr QueryElevationComponent--實現競價排名(手動干預)

轉載請註明源地址:http://blog.csdn.net/weijonathan/article/details/39554579


我們知道。在很多搜索網站上都有這樣的一個功能,就是競價排名,綁定某個關鍵字,給錢了那我給你排前面。

包括很多視頻網站的一些站內搜索功能也有這樣的需求;

最近在看solr官網,solr的查詢功能中就包含了這一功能。參考地址如下:

https://wiki.apache.org/solr/QueryElevationComponent#elevateIds.2FexcludeIds

下面這個網址包含了solr所有功能;對solr感興趣的可以收藏下!

https://cwiki.apache.org/confluence/display/solr/Spell+Checking

那麼接下來我們來實現我們的功能把。

solrconfig.xml

<searchComponent name="elevator"
	class="org.apache.solr.handler.component.QueryElevationComponent">
	<!-- pick a fieldType to analyze queries -->
	<str name="queryFieldType">string</str>
	<str name="config-file">elevate.xml</str>
</searchComponent>

<!-- A request handler for demonstrating the elevator component -->
<requestHandler name="/elevate"
	class="org.apache.solr.handler.component.SearchHandler" startup="lazy">
	<lst name="defaults">
		<str name="echoParams">explicit</str>
		<!-- <str name="df">text</str> -->
	</lst>
	<arr name="last-components">
		<str>elevator</str>
	</arr>
</requestHandler>

config-file:elevate.xml,這個文件solr默認已經存在,需要自己配置;默認跟solrconfig.xml同一目錄,如無特殊要求可不做修改

searchComponent的name屬性是和requestHandler有一個綁定關係的,大家注意一下;

還有就是,requestHandler定義的名稱/elevate是我們後面需要用到的節點名,就像selelct一樣。使用這一功能的時候把select換成elevate。
requestHandler標籤中的defaults-->df是定義了你要做競價排名,或者說人工干預的查詢字段;如果此處不指定的話,需要在查詢的時候指定;


<elevate>
 <query text="isle">
   <doc id="6493" />  <!-- put the actual ipod at the top -->
   <doc id="3971" exclude="true" /> <!-- exclude this cable -->
 </query>
</elevate>
以上是一個簡單的示例,當用戶查詢isle時,docID爲6493的文檔會被提到最前。而這裏的docID爲3971的文檔將會被提出到查詢的結果之外,因爲配置了exclude屬性爲true。

如果不配置默認爲false,即不排除!

接下來我們查詢下看看。這裏先看下正常的查詢結果。這裏我們把enableElevation設置爲false即可

<response>
	<lst name="responseHeader">
		<int name="status">0</int>
		<int name="QTime">1</int>
		<lst name="params">
			<str name="enableElevation">false</str>
			<str name="df">name</str>
			<str name="q">isle</str>
			<str name="forceElevation">true</str>
		</lst>
	</lst>
	<result name="response" numFound="6" start="0">
		<doc>
			<str name="id">302</str>
			<str name="name">The Isle</str>
			<str name="year">2001</str>
			<long name="_version_">1480190152307376130</long>
		</doc>
		<doc>
			<str name="id">2</str>
			<str name="name">Isle of Man TT 2004 Review</str>
			<str name="year">2004</str>
			<long name="_version_">1480190152202518528</long>
		</doc>
		<doc>
			<str name="id">6493</str>
			<str name="name">Val Lewton: Isle of the Dead / Bedlam</str>
			<str name="year">1945</str>
			<long name="_version_">1480190153170354189</long>
		</doc>
		<doc>
			<str name="id">3871</str>
			<str name="name">The Who: Live at the Isle of Wight Festival</str>
			<str name="year">1970</str>
			<long name="_version_">1480190152951201796</long>
		</doc>
		<doc>
			<str name="id">9409</str>
			<str name="name">Isle of Wight Festival: Message to Love: 1970</str>
			<str name="year">1970</str>
			<long name="_version_">1480190153367486468</long>
		</doc>
		<doc>
			<str name="id">13617</str>
			<str name="name">
				Jethro Tull: Nothing Is Easy: Live at the Isle of Wight 1970
			</str>
			<str name="year">2005</str>
			<long name="_version_">1480190153579298828</long>
		</doc>
	</result>
</response>

接下來我們把enableElevation設置爲true,查詢做下對比

http://localhost:8081/solr/collection1/elevate?q=isle&enableElevation=true&forceElevation=true

查詢結果如下:’

<response>
	<lst name="responseHeader">
		<int name="status">0</int>
		<int name="QTime">18</int>
		<lst name="params">
			<str name="enableElevation">true</str>
			<str name="df">name</str>
			<str name="q">isle</str>
			<str name="forceElevation">true</str>
		</lst>
	</lst>
	<result name="response" numFound="6" start="0">
		<doc>
			<str name="id">6493</str>
			<str name="name">Val Lewton: Isle of the Dead / Bedlam</str> 
			<str name="year">1945</str>
			<long name="_version_">1480190153170354189</long>
		</doc>
		<doc>
			<str name="id">302</str>
			<str name="name">The Isle</str>
			<str name="year">2001</str>
			<long name="_version_">1480190152307376130</long>
		</doc>
		<doc>
			<str name="id">2</str>
			<str name="name">Isle of Man TT 2004 Review</str>
			<str name="year">2004</str>
			<long name="_version_">1480190152202518528</long>
		</doc>
		<doc>
			<str name="id">3871</str>
			<str name="name">The Who: Live at the Isle of Wight Festival</str>
			<str name="year">1970</str>
			<long name="_version_">1480190152951201796</long>
		</doc>
		<doc>
			<str name="id">9409</str>
			<str name="name">Isle of Wight Festival: Message to Love: 1970</str>
			<str name="year">1970</str>
			<long name="_version_">1480190153367486468</long>
		</doc>
		<doc>
			<str name="id">13617</str>
			<str name="name">
				Jethro Tull: Nothing Is Easy: Live at the Isle of Wight 1970
			</str>
			<str name="year">2005</str>
			<long name="_version_">1480190153579298828</long>
		</doc>
	</result>
</response>
可以看到docID爲6493的文檔被提到最前。而docID爲3971的文檔被剔除結果集。

好了,到這基本上功能就完成了。有什麼不對的地方請多加指點;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章