solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据
solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据
上一节我们完成了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查询与获取数据的,非常方便好用,这个我以后会教大家怎么使用,今天就先讲的这里吧.
qq群: 424259523
solr与.net系列课程(四)solr查询参数的讲解与.net如何获取solr数据的更多相关文章
- solr与.net系列课程(五)solrnet的使用
solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下solr的.net客户端solrnet 出处 ...
- solr与.net系列课程(三)solr连接数据库
solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些 ...
- solr与.net系列课程(二)solr的配置文件及其含义
solr与.net系列课程(二)solr的配置文件及其含义 本节内容还是不会涉及到.net与数据库的内容,但是不要着急,这都是学时solr必学要掌握的东西,solr可不是像其他的dll文件一样,只需 ...
- solr与.net系列课程(九)solr5.1的配置
solr与.net系列课程(九)solr5.1的配置 最近一些园友来咨询solr5.1的配置方式,然后我就去官网下载了个最新版本的solr,发现solr5.0以后solr的下载包里的内容发生的变化,移 ...
- solr与.net系列课程(八)solr中重跑索引的注意事项
solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来 ...
- solr与.net系列课程(七)solr主从复制
solr与.net系列课程(七)solr主从复制 既然solr是解决大量数据全文索引的方案,由于高并发的问题,我们就要考虑solr的负载均衡了,solr提供非常简单的主从复制的配置方法,那么下面 ...
- solr与.net系列课程(六)solr定时增量索引与安全
solr与.net系列课程(六)solr定时增量索引与安全 solr增量索引的方式,就是一个Http请求,但是这样的请求显然不能满足要求,我们需要的是一个自动的增量索引,solr官方提供了一个定时器 ...
- solr与.net系列课程(一)solr的安装与配置
不久之前开发了一个项目,需要用到solr,因为所以在开始再网上查找资料,但是发现大部分的资料都是很片面的,要么就是只讲解solr如何安装的,要么就是只讲解solr的某一个部分的,而且很多都是资料都是一 ...
- Solr学习总结(四)Solr查询参数
今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...
随机推荐
- CmdBuild
cmdBuild官网地址:http://www.cmdbuild.org/it 下载.功能和安装说明:http://www.cmdbuild.org/en/download 扩展组件: shark-c ...
- jquery源码学习之extend
jquery的extend方法现项目中经常使用,现在了解一下它的实现. 说起extend就要先了解一个jQuery的$.extend和$.fn.extend作用及区别 jQuery为开发插件提拱了两个 ...
- python生成中文验证码,带旋转,带干扰噪音线段
# -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...
- POJ(3468)
A Simple Problem with Integers http://poj.org/problem?id=3468 #include <stdio.h> struct node { ...
- 命令行启动win7系统操作部分功能
control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /name Microsoft.AddHardware ...
- LApacheMP基础环境搭建
一.安装前准备 1.下载所需软件包: apr | http://apache.etoak.com/apr/ apr-util | http://apache.etoak.com/apr/ autoco ...
- NLPP-02-Exercises
<PYTHON自然语言处理>第2章 内容简介:各种文本语料库. 古腾堡项目 www.gutenberg.org OLAC元数据格式档 http://www.language-archive ...
- 5.HotSpot的算法实现
1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受. 而且,可达性分析必须在一个一致性的快照中进行-即 ...
- Block的copy和循环引用的问题
在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于是在目前的项目中大量的使用block. 在我的头文件我是这样声明使用block的. 我将block声明为 ...
- php 生日提醒程序
<?php $startdate=time(); //当前时间 $birth="2013-05-13"; // 出生日期 $arr=explode(" ...