solr與.net系列課程(四)solr查詢參數的講解與.net如何獲取solr數據php
上一節咱們完成了solr鏈接數據庫,細心的朋友會發現一個問題,就是solr其實和語言沒有任何關係,配置完成後任何語言均可以直接調用,本章咱們主要對solr的查詢作出講解,而後就是新接觸的人最關心的.net如何獲取solr中的數據.ajax
本節我準備了一個300萬左右的數據表,爲你們作演示sql
而後咱們開始配置schema.xml 文件:數據庫
<field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="title" type="text_cn" indexed="true" stored="true" multiValued="false" /> <field name="area" type="string" indexed="true" stored="true" /> <field name="industry" type="string" indexed="true" stored="true" /> <field name="industrys" type="string" indexed="true" stored="true" /> <field name="body" type="smartChnText" indexed="true" stored="true"/> <field name="adddate" type="date" indexed="true" stored="true" multiValued="false"/> <field name="columns" type="smartChnText" indexed="true" stored="true"/> <field name="sorts" type="string" indexed="true" stored="true"/> <field name="url" type="string" indexed="true" stored="true" required="true" /> <field name="orderColumn" type="string" indexed="true" stored="true"/> <field name="phase" type="string" indexed="true" stored="true"/> <field name="phasetype" type="string" indexed="true" stored="true"/> <field name="pfund" type="tfloat" indexed="true" stored="true"/> <field name="flag" type="string" indexed="true" stored="true" />
這裏說明一下,數據表中的數據能夠選擇行的存入solr中,想存哪一個就配置哪一個就好了apache
type="text_cn" 就是我配置的ik分詞器,type="smartChnText"是solr自帶的分詞器,分詞效果通常,但也要配置,直接在配置ik分詞器的位置粘貼以下代碼便可:json
<!-- 加入smartcn 中文分詞器 text_newcn--> <fieldType name="smartChnText" class="solr.TextField" > <analyzer class="org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer"/> </fieldType>
這裏強調一下,分詞器有不少種,想要哪一種就用哪一種瀏覽器
配置完成後開始配置data-confing.xml文件ruby
<?xml version="1.0" encoding="UTF-8"?> <dataConfig> <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName=BHI_DATABASE" user="sa" password="123"/> <document name="Info"> <entity name="Biddings" pk="OriginalID" transformer="ClobTransformer" query="SELECT OriginalID,'項目標訊' as orderColumn, '項目標訊' as columns ,'${dataimporter.last_index_time}' as ColumnID,dbo.ShowLabelName(Area) as Area,Pfund,ColumnID as flag,category,dbo.ShowLabelName(Industry) as Industry, Industry as Industrys,Title,( dbo.fun_joinInfo(OriginalID) + CONVERT(VARCHAR(MAX),description) ) AS description,AddDate FROM BHI_DATABASE.dbo.Info_Bidding" deltaImportQuery="SELECT OriginalID,'項目標訊' as orderColumn, '項目標訊' as columns ,'${dataimporter.last_index_time}' as ColumnID,dbo.ShowLabelName(Area) as Area,Pfund,ColumnID as flag,category,dbo.ShowLabelName(Industry) as Industry,Industry as Industrys,Title,( dbo.fun_joinInfo(OriginalID) + CONVERT(VARCHAR(MAX),description) ) AS description,AddDate FROM BHI_DATABASE.dbo.Info_Bidding where adddate > '${dataimporter.last_index_time}'" deltaQuery="SELECT OriginalID FROM BHI_DATABASE.dbo.Info_Bidding where adddate > '${dataimporter.last_index_time}'"> <field column="OriginalID" name="id" /> <field column="title" name="title" /> <field column="area" name="area" /> <field column="industry" name="industry" /> <field column="industrys" name="industrys" /> <field column="description" name="body" /> <field column="adddate" name="adddate" /> <field column="ColumnID" name="sorts" /> <field column="columns" name="columns" /> <field column="OriginalID" name="url" /> <field column="orderColumn" name="orderColumn" /> <field column="Pfund" name="pfund" /> <field column="category" name="phase" /> <field column="flag" name="flag" /> </entity> </document>
這裏我沒有用簡單的select id,name ...from 表名這種簡單的sql語句,而是寫了一個帶有別名,函數的sql語句,就是告訴你們,這裏能夠寫任何sql語句,但視圖,錶鏈接最好不要使用,要使用錶鏈接的話我上節課已經講解了,想用的朋友能夠回去看看.服務器
Solr 是如何查詢的呢?這裏先列出solr查詢所須要的參數函數
經常使用
q - 查詢字符串,必須的。
fl - 指定返回那些字段內容,用逗號或空格分隔多個。
start - 返回第一條記錄在完整找到結果中的偏移位置,0開始,通常分頁用。
rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 「inStock」 降序, 再 「price」 升序,默認是相關性降序。
wt - (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3增長的,要用通知咱們,由於默認沒有打開。
fq - (filter query)過慮查詢,做用:在q查詢符合結果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字mm,而且date_time是20081001到20091031之間的。官方文檔:http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758577506d6002
不經常使用
q.op - 覆蓋schema.xml的defaultOperator(有空格時用"AND"仍是用"OR"操做邏輯),通常默認指定
df - 默認的查詢字段,通常默認指定
qt - (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。
其它
indent - 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。
version - 查詢語法的版本,建議不使用它,由服務器指定默認值。
那麼咱們來實際查詢一個試試
Selet * from table where area=’重慶’ and columns=’項目標訊’ --這個轉換成solr語句怎麼寫?
http://127.0.0.1:8080/solr/collection1/select?q=area:重慶&fq=columns:項目標訊&wt=xml&indent=true
或
http://127.0.0.1:8080/solr/collection1/select?q=*:*&fq=area:重慶&fq=columns:項目標訊&wt=xml&indent=true
q是主查詢 fq是輔查下(能夠多個)
咱們來看看效果,直接在瀏覽器中輸入上面的地址:
像不像咱們使用的ajax請求,請求連接獲取數據
我想查詢部分字段怎麼辦呢,使用fl參數
http://127.0.0.1:8080/solr/collection1/select?fl=title,orderColumn,area,columns,id&q=*:*&fq=area:重慶&fq=columns:項目標訊&wt=json&indent=true
看看效果,這個返回json數據:
如今咱們練習一個
Select top 2 title,orderColumn,area,columns,id from table where area=山東 OR area= 福建 and columns=項目標訊 order by adddate desc
轉換爲solr語句:http://127.0.0.1:8080/solr/collection1/select?fl=title,orderColumn,area,columns,id&q=*:*&fq=area:福建+OR+area:山東&fq=columns:項目標訊 &wt=json&indent=true&&start=0&rows=2&sort=adddate desc
上面列出的查詢條件均可以自由組合( OR 和 AND 要大寫,小寫有時不出數據)
好了下面在就該說一下你們最關心的問題了,.net如何獲取這些數據(這裏先使用最原始的方式)
首先建立個程序,隨便建立個aspx頁面,在後臺輸入以下代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net; using System.IO; using System.Text; namespace solr實例 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string solr_url = @"http://127.0.0.1:8080/solr/collection1/select?fl=title,orderColumn,area,columns,id&q=*:*&fq=area:山東 OR area:福建 &fq=columns:項目標訊&wt=xml&indent=true&&start=0&rows=10&sort=adddate desc"; WebRequest wr = WebRequest.Create(solr_url); Stream s = wr.GetResponse().GetResponseStream(); StreamReader sr = new StreamReader(s, Encoding.UTF8); string result = sr.ReadToEnd(); } } }
執行如下看看 result中有沒有數據?
這樣咱們就獲得數據了,可是這是一個字符串啊,怎麼使用呢,我我這裏使用數據契約將上述內容轉化爲數據實體,數據契約不瞭解的話去網上查一查,很好理解的.
首先建立契約類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace ClassLibrary1 { [DataContract] public class Solr_Projects { [DataMember(Name = "responseHeader")] public Solr_Projects_ResponseHeader ResponseHeader { get; set; } [DataMember(Name = "response")] public Response Response { get; set; } } [DataContract] public class Solr_Projects_ResponseHeader { [DataMember(Name = "status")] public string Status { get; set; } [DataMember(Name = "QTime")] public string QTime { get; set; } [DataMember(Name = "params")] public Params Params { get; set; } } [DataContract] public class Params { [DataMember(Name = "indent")] public string Indent { get; set; } [DataMember(Name = "start")] public string Start { get; set; } [DataMember(Name = "q")] public string Q { get; set; } [DataMember(Name = "wt")] public string Wt { get; set; } [IgnoreDataMember] //[DataMember(Name = "fq")] public string Fq { get; set; } [DataMember(Name = "version")] public string Version { get; set; } [DataMember(Name = "rows")] public string Rows { get; set; } } [DataContract(Name = "response")] public class Response { [DataMember(Name = "numFound")] public string NumFound { get; set; } [DataMember(Name = "start")] public string Start { get; set; } [DataMember(Name = "solrUrl")] public string SolrUrl { get; set; } [DataMember(Name = "docs")] public Docs[] Docs { get; set; } } [DataContract] public class Docs { [DataMember(Name = "title")] public string Title { get; set; } //[IgnoreDataMember] [DataMember(Name = "orderColumn")] public string OrderColumn { get; set; } [IgnoreDataMember] //[DataMember(Name = "body")] public string Body { get; set; } [DataMember(Name = "area")] public string AreaName { get; set; } [DataMember] public string AreaID { get; set; } [DataMember(Name = "columns")] public string Columns { get; set; } [DataMember(Name = "id")] public string Id { get; set; } [IgnoreDataMember] //[DataMember(Name = "url")] public string Url { get; set; } [DataMember(Name = "phase")] public string PhaseID { get; set; } [DataMember] public string PhaseName { get; set; } [DataMember(Name = "adddate")] public string AddDate { get; set; } [DataMember(Name = "industry")] public string IndustryName { get; set; } [DataMember] public string IndustryId { get; set; } [DataMember(Name = "phasetype")] public string PhaseType { get; set; } [DataMember(Name = "pfund")] public string Pfund { get; set; } [DataMember(Name = "categroy")] public string Category { get; set; } } }
而後咱們就能夠用這個契約類去獲取數據了(上面的屬性是和數據對應的,名稱相同的就會存儲相應的數據,沒有的就不存,我這個裏面數據比較多,實際上只用了五個字段)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net; using System.IO; using System.Text; using ClassLibrary1; using System.Runtime.Serialization; using System.Web.Script.Serialization; using System.Runtime.Serialization.Json; namespace solr實例 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string solr_url = @"http://127.0.0.1:8080/solr/collection1/select?fl=title,orderColumn,area,columns,id&q=*:*&fq=area:山東 OR area:福建 &fq=columns:項目標訊&wt=json&indent=true&&start=0&rows=10&sort=adddate desc"; WebRequest wr = WebRequest.Create(solr_url); Stream s = wr.GetResponse().GetResponseStream(); StreamReader sr = new StreamReader(s, Encoding.UTF8); string result = sr.ReadToEnd(); Solr_Projects solr_result; //反序列化 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(result))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Solr_Projects)); solr_result = (Solr_Projects)serializer.ReadObject(ms); } solr_result.Response.SolrUrl = solr_url + "&numFound=" + solr_result.Response.NumFound; Docs[] docs = solr_result.Response.Docs;//獲取須要展現信息的對象 } } }
看看結果:
個人語句中只查詢了五個字段,因此其餘的都是null,好了,如今字符串已經轉換爲數據實體了,數據實體咱們就能夠想怎麼辦就怎麼辦了,這裏說明一下,這是最原始的的使用方式,url須要,本身去拼接
咱們.net中有solr的客戶端 ,叫solrnet,它是專門操做solr查詢與獲取數據的,很是方便好用,這個我之後會教你們怎麼使用,今天就先講的這裏吧.
qq羣: 424259523