springの中でsorのコードを使って実現します。
sorの使用法を紹介する前に,sorのサーバークラスタをインストールする必要がある。基本的にはzookeeper、tomcat、jdk、sorをインストールし、必要に応じて3つのプロファイルを配置すればいいです。本人は具体的に操作したことがないので、どうやってsorクラスタを構築しますか?したがって、どのようにsorクラスタを構築するかについては、読者がオンラインで他の資料を見ることができます。ここでは、sorクラスタを構築した後、クライアントがどのようにsorクラスタにアクセスするかを紹介します。
以前紹介したように、springパッケージのnosqlとsqlデータベースの使用は全部xxTemplateを通しています。ソロも例外ではない。
私たちはソロのjarカバンを導入したいです。
しかし、本文ではspringにパッケージされたxxTemplateという形式で説明しません。個人はspringパッケージのsour方式を使う時、様々な問題に出会いました。能力が多すぎて、コントロールできないかもしれません。次に、ソロの原生アプリを使って訪問する方法を説明します。
まず、
ソロの生コードアプリを導入するjarパッケージ
springの配置ファイルに私達のsorのFactoryBean類を配置して、このようなのは私達が自分の業務のservice類の属性を編纂してsorを操作するのです。
order Infoは私たちがsorに記憶しているデータ構造beanです。
再度:
私達のSolCloudServer FactoryBean類を編纂して、その中はspringのFactoryBean<SolrServer>を使って、InitializingBenと。この両者の意味については、読者が他の資料を参照することができ、基本的な意味は、スプリング容器がbeanを登録する前に、いくつかの初期化操作を行う必要があるということである。afterPropertiesset法により,私たちがソロを使う前に行ういくつかの初期化動作を見ることができます。
今から私たちのサービスクラスを作成できます。ここは私たちが具体的にソロを操作するところです。
1. sorがクエリ文を生成するときは、qクエリとfqクエリの両方があります。どのようなクエリ条件がqクエリに含まれていますか?どのようなクエリー条件がfqクエリに含まれていますか?クエリの効率には大きな影響があります。一般的には、固定された不変のクエリ条件はqクエリにあり、常に変化するクエリ条件はfqにある。上記のコードの中でvalidTag:1はqクエリに入れて、循環の中の文字列filterは私達のfqクエリに置きました。
2. sorクエリの場合、sorサーバクラスタのプロファイルでどのようなワードスプリッタが使用されているかを確認してください。あいまいなクエリの結果には異なる用語スプリットが影響します。例えば、一般的なIK分詞器と標準分詞器(もしフィールド名があるなら、私は中国人です。ik分詞器はソロでの記憶は「私」、「中国人」、「中国人」、「国人」となります。標準分詞器は「私」、「はい」、「中」、「国」、「人」と記憶されます。私たちがフルネームで調べたら、つまり、中国人です。両方とも大丈夫です。しかし、あいまいな検索を使って、例えば「*私は*です」と調べたら、二つの分詞器の分詞は全部調べられません。もし私たちの検索条件が「*中国人*」なら、ik分詞器の下で結果が調べられます。標準分詞器の下では結果が分かりません。)
3. sorを使用する過程では、タイミングよくsorのoptimize関数を実行してディスクの断片を整理する必要があり、そうでないと読み書き効率に影響を与えます。optimizeのパラメータについては(false,false,5)が提案されています。
4. ソロデータを書くときは、できるだけcreateIndexBatchを使うのは、ソロが書き込みを実行する時に、1つのデータを書き込む時と複数のデータを書き込む時は、フルインデックスを作成する必要があります。実行時間は同じです。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
以前紹介したように、springパッケージのnosqlとsqlデータベースの使用は全部xxTemplateを通しています。ソロも例外ではない。
私たちはソロのjarカバンを導入したいです。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
その後ソロを導入してspringにパッケージする構成
<bean id="orderInfoSolrServer" class="com.xxxx.SolrCloudServerFactoryBean">
<property name="zkHost" value="${solr.zkHost}"/>
<property name="defaultCollection" value="orderInfo"/>
<property name="zkClientTimeout" value="6000"/>
</bean>
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate" scope="singleton">
<constructor-arg ref="orderInfoSolrServer" />
</bean>
<bean id="solrService" class="com.xxxx.SolrServiceImpl">
<property name="solrOperations" ref="solrTemplate" />
</bean>
そして私たちのSolServiceImplを書き換えるだけでいいです。しかし、本文ではspringにパッケージされたxxTemplateという形式で説明しません。個人はspringパッケージのsour方式を使う時、様々な問題に出会いました。能力が多すぎて、コントロールできないかもしれません。次に、ソロの原生アプリを使って訪問する方法を説明します。
まず、
ソロの生コードアプリを導入するjarパッケージ
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.7.2</version>
</dependency>
次:springの配置ファイルに私達のsorのFactoryBean類を配置して、このようなのは私達が自分の業務のservice類の属性を編纂してsorを操作するのです。
<bean id="orderInfoSolrServer" class="com.xxxx.SolrCloudServerFactoryBean">
<property name="zkHost" value="${solr.zkHost}"/>
<property name="defaultCollection" value="orderInfo"/>
<property name="zkClientTimeout" value="6000"/>
</bean>
sor.zkHostは私達が配置したzookeeperクラスタです。order Infoは私たちがsorに記憶しているデータ構造beanです。
再度:
私達のSolCloudServer FactoryBean類を編纂して、その中はspringのFactoryBean<SolrServer>を使って、InitializingBenと。この両者の意味については、読者が他の資料を参照することができ、基本的な意味は、スプリング容器がbeanを登録する前に、いくつかの初期化操作を行う必要があるということである。afterPropertiesset法により,私たちがソロを使う前に行ういくつかの初期化動作を見ることができます。
package com.jd.fms.prism.solr.service;
import org.apache.http.client.HttpClient;
/**
* solrj spring integration
*
* @author bjchenrui
*/
public class SolrCloudServerFactoryBean implements FactoryBean<SolrServer>, InitializingBean {
private CloudSolrServer cloudSolrServer;
private String zkHost;
private String defaultCollection;
private int maxConnections = 1000;
private int maxConnectionsPerHost = 500;
private int zkClientTimeout = 10000;
private int zkConnectTimeout = 10000;
private Lock lock = new ReentrantLock();
public SolrServer getObject() throws Exception {
return cloudSolrServer;
}
public Class<SolrServer> getObjectType() {
return SolrServer.class;
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() throws Exception {
ModifiableSolrParams params = new ModifiableSolrParams();
params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, maxConnections);
params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, maxConnectionsPerHost);
HttpClient client = HttpClientUtil.createClient(params);
LBHttpSolrServer lbServer = new LBHttpSolrServer(client);
lock.lock();
try {
if(cloudSolrServer == null) {
cloudSolrServer = new CloudSolrServer(zkHost, lbServer);
}
} finally {
lock.unlock();
}
cloudSolrServer.setDefaultCollection(defaultCollection);
cloudSolrServer.setZkClientTimeout(zkClientTimeout);
cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
}
public void setCloudSolrServer(CloudSolrServer cloudSolrServer) {
this.cloudSolrServer = cloudSolrServer;
}
public void setZkHost(String zkHost) {
this.zkHost = zkHost;
}
public void setDefaultCollection(String defaultCollection) {
this.defaultCollection = defaultCollection;
}
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
public void setMaxConnectionsPerHost(int maxConnectionsPerHost) {
this.maxConnectionsPerHost = maxConnectionsPerHost;
}
public void setZkClientTimeout(int zkClientTimeout) {
this.zkClientTimeout = zkClientTimeout;
}
public void setZkConnectTimeout(int zkConnectTimeout) {
this.zkConnectTimeout = zkConnectTimeout;
}
}
最後:今から私たちのサービスクラスを作成できます。ここは私たちが具体的にソロを操作するところです。
package com.jd.fms.prism.solr.service.impl;
import com.jd.fms.prism.common.utils.DateUtil;
@Service("orderInfoSolrService")
public class OrderInfoNativeSolrServiceImpl {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DateUtil.FORMATER11);
private static SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat(DateUtil.FORMATER4);
@Resource(name = "orderInfoSolrServer")
private SolrServer solrServer;
/**
*
*
* @param orderInfo
*/
public void creatIndex(OrderInfo orderInfo) throws IOException, SolrServerException {
solrServer.addBean(orderInfo);
solrServer.commit();
}
/**
* 。 , , 。
* @param orderIdfilter
* @param queryObj
* @param queryTimeList
* @param sorts
* @return
* @throws Exception
*/
public SolrQuery iniFilter(String orderIdfilter,OrderInfo queryObj,List<QueryTime> queryTimeList, Sort... sorts) throws Exception {
SolrQuery sQuery = new SolrQuery();
String queryQ = "validTag:1";
sQuery.setQuery(queryQ);
StringBuilder filter = new StringBuilder();
if(null != orderIdfilter){
filter.append(orderIdfilter);
queryObj.setOrderId(null);
}
//
Field[] fields = queryObj.getClass().getDeclaredFields();
String fieldName = "";
String fieldValue = "";
for (Field field:fields){
if(field.isAnnotationPresent(org.apache.solr.client.solrj.beans.Field.class)){
field.setAccessible(true);
fieldName = field.getName();
fieldValue = String.valueOf(field.get(queryObj));
if (null != fieldValue && !"null".equals(fieldValue) && !"".equals(fieldValue) && !"0.0".equals(fieldValue)){
// ,
if(fieldName.equals("memberId") || fieldName.equals("orderType")){
fieldValue = "*" + fieldValue + "*";
}
filter.append(fieldName + ":" + fieldValue).append(" AND ");
}
}
}
if(queryTimeList!=null && queryTimeList.size() > 0) {
Iterator<QueryTime> iterator = queryTimeList.iterator();
while(iterator.hasNext()) {
QueryTime queryTime = iterator.next();
String beginDate = simpleDateFormat.format(queryTime.getBeginTime().getTime());
String endDate = simpleDateFormat.format(queryTime.getEndTime().getTime());
filter.append(queryTime.getFieldName() + ":" + "[" + beginDate + " TO " + endDate + "] AND ");
}
}
if(filter.length()>0){
filter.delete(filter.length()-5, filter.length());
}
sQuery.addFilterQuery(filter.toString());
if(sQuery.toString().equals("")){
sQuery.setQuery("*:*");
}
return sQuery;
}
/**
* , solr , 。 。
* @param map
* @param queryObj
* @param queryTimeList
* @param page
* @param sorts
* @return
* @throws Exception
*/
public Page<OrderInfo> query(Map map,OrderInfo queryObj, List<QueryTime> queryTimeList, Pageable page, Sort... sorts) throws Exception {
SolrQuery sQuery = iniFilter(null,queryObj,queryTimeList);
//
if(page != null){
sQuery.setStart(page.getPageNumber()*page.getPageSize());
sQuery.setRows(page.getPageSize());
}
//
/*if (null != sorts){
sQuery.setSort("orderId",SolrQuery.ORDER.asc);
}*/
QueryResponse response = null;
sQuery.setGetFieldStatistics("orderPrice");
sQuery.setGetFieldStatistics("duePrice");
sQuery.setGetFieldStatistics("diffPrice");
try {
response = solrServer.query(sQuery);
} catch (SolrServerException e) {
e.printStackTrace();
}
SolrDocumentList list = response.getResults();
Map<String, FieldStatsInfo> mapSum = response.getFieldStatsInfo();
String orderPriceSum = null;
if(mapSum.get("orderPrice") != null && !mapSum.get("orderPrice").toString().equals("") ){
orderPriceSum = mapSum.get("orderPrice").getSum().toString();
}
String duePriceSum = null;
if(mapSum.get("duePrice") != null && !mapSum.get("duePrice").toString().equals("") ){
duePriceSum = mapSum.get("duePrice").getSum().toString();
}
String diffPriceSum = null;
if(mapSum.get("diffPrice") != null && !mapSum.get("diffPrice").toString().equals("") ){
diffPriceSum = mapSum.get("diffPrice").getSum().toString();
}
List<OrderInfo> list1 = new ArrayList<OrderInfo>();
DocumentObjectBinder binder = new DocumentObjectBinder();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
OrderInfo orderInfo = binder.getBean(OrderInfo.class, (SolrDocument) iterator.next());
list1.add(orderInfo);
}
map.put("orderPriceSum", orderPriceSum);
map.put("duePriceSum", duePriceSum);
map.put("diffPriceSum", diffPriceSum);
Page<OrderInfo> pageList = new PageImpl<OrderInfo>(list1,page,list.getNumFound());
return pageList;
}
/**
* key 。
* @param id
* @return
* @throws Exception
*/
public List<OrderInfo> queryByOrderId(String id) throws Exception {
SolrQuery sQuery = new SolrQuery();
String filter = "orderId" + ":" + id;
sQuery.setQuery(filter);
QueryResponse response = null;
try {
response = solrServer.query(sQuery);
} catch (SolrServerException e) {
e.printStackTrace();
}
SolrDocumentList list = response.getResults();
List<OrderInfo> list1 = new ArrayList<OrderInfo>();
DocumentObjectBinder binder = new DocumentObjectBinder();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
OrderInfo orderInfo = binder.getBean(OrderInfo.class, (SolrDocument) iterator.next());
list1.add(orderInfo);
}
return list1;
}
public void deleteAll(OrderInfo orderInfo) throws IOException, SolrServerException {
String sQuery = "*:*";
solrServer.deleteByQuery(sQuery);
}
public void deleteById(String id) {
}
public void createIndexBatch(List<OrderInfo> orderInfoList) throws IOException, SolrServerException {
solrServer.addBeans(orderInfoList);
solrServer.commit();
}
public void deleteBySolrQuery(String solrQuery) throws IOException, SolrServerException {
solrServer.deleteByQuery(solrQuery);
solrServer.commit();
}
public SolrServer getSolrServer() {
return solrServer;
}
public void setSolrServer(SolrServer solrServer) {
this.solrServer = solrServer;
}
}
もちろんソロのアプリはここだけではないです。ここでは一般的な使い方を羅列しただけです。ソロの問い合わせには、以下の点に注意が必要です。1. sorがクエリ文を生成するときは、qクエリとfqクエリの両方があります。どのようなクエリ条件がqクエリに含まれていますか?どのようなクエリー条件がfqクエリに含まれていますか?クエリの効率には大きな影響があります。一般的には、固定された不変のクエリ条件はqクエリにあり、常に変化するクエリ条件はfqにある。上記のコードの中でvalidTag:1はqクエリに入れて、循環の中の文字列filterは私達のfqクエリに置きました。
2. sorクエリの場合、sorサーバクラスタのプロファイルでどのようなワードスプリッタが使用されているかを確認してください。あいまいなクエリの結果には異なる用語スプリットが影響します。例えば、一般的なIK分詞器と標準分詞器(もしフィールド名があるなら、私は中国人です。ik分詞器はソロでの記憶は「私」、「中国人」、「中国人」、「国人」となります。標準分詞器は「私」、「はい」、「中」、「国」、「人」と記憶されます。私たちがフルネームで調べたら、つまり、中国人です。両方とも大丈夫です。しかし、あいまいな検索を使って、例えば「*私は*です」と調べたら、二つの分詞器の分詞は全部調べられません。もし私たちの検索条件が「*中国人*」なら、ik分詞器の下で結果が調べられます。標準分詞器の下では結果が分かりません。)
3. sorを使用する過程では、タイミングよくsorのoptimize関数を実行してディスクの断片を整理する必要があり、そうでないと読み書き効率に影響を与えます。optimizeのパラメータについては(false,false,5)が提案されています。
4. ソロデータを書くときは、できるだけcreateIndexBatchを使うのは、ソロが書き込みを実行する時に、1つのデータを書き込む時と複数のデータを書き込む時は、フルインデックスを作成する必要があります。実行時間は同じです。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。