专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:04:52       共计:3656 浏览

上一节我们完成了solr连接数据库,细心的朋友会发现一个问题,就是solr其实和语言没有任何关系,配置完成后任何语言都可以直接调用,本章我们主要对solr的查询做出讲解,然后就是新接触的人最关心的.net如何获取solr中的数据.


     本节我准备了一个300万左右的数据表,为大家做演示


     然后我们开始配置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中,想存哪个就配置哪个就行了


     type="text_cn" 就是我配置的ik分词器,type="smartChnText"是solr自带的分词器,分词效果一般,但也要配置,直接在配置ik分词器的位置粘贴如下代码即可:

复制代码


<!-- 加入smartcn 中文分词器 text_newcn-->

<fieldType name="smartChnText" class="solr.TextField"  >  


   <analyzer  class="org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer"/>  


</fieldType>


复制代码


       这里强调一下,分词器有很多种,想要哪种就用哪种


       配置完成后开始配置data-confing.xml文件

复制代码


<?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查询与获取数据的,非常方便好用,这个我以后会教大家怎么使用,今天就先讲的这里吧.



版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:solr与.net系列课程(五)solrnet的使用 | ·下一条:solr与.net系列课程(三)solr连接数据库

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有