import java.io.IOException;
import java.net.MalformedURLException;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
/**
* @date 2013年12月4日
* @author huangjie
*/
@SuppressWarnings("deprecation")
public class SolrTest {
//指定solr服务器的地址
private final static String URL = "http://localhost:8080/solr";
@Test
public void test1(){
//1、创建SolrServer对象,该对象有两个可以使用,都是线程安全的
// CommonsHttpSolrServer:启动web服务器使用的,通过http请求的
// EmbeddedSolrServer:内嵌式的,导入solr的jar包就可以使用了
try {
CommonsHttpSolrServer server = new CommonsHttpSolrServer(URL);
//把查询出来的数据全部删除
// server.deleteByQuery("*:*");
// server.commit();
SolrInputDocument doc = new SolrInputDocument();
//id是必填的,并且是String类型的
//<field name="id" type="string" indexed="true" stored="true" required="true" />
//id是唯一的主键,当多次添加的时候,最后添加的相同id会覆盖前面的域
doc.addField("id", "1");
doc.addField("msg_title", "这是我的第一个solrj程序");
doc.addField("msg_content", "solr程序的运行");
server.add(doc);
server.commit();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1、
上述的程序会报错:
2、Schema.xml中有一大组field,所有要加到solr域里面的field都要往该配置文件里面加,而上面的content字段并没有在schema.xml里面
因为默认的title的type是text_general
<field name="title"type="text_general" indexed="true" stored="true"multiValued="true"/>
经过查看,text_general类型分词是标准分词
查看索引如下:
3、所以这里有两种做法
第一种:把title的type给改成中文搜索的type,这里是textComplex
第二种:增加一个field,比如msg_title,该field支持用中文分词的
现在用第二种方法,在schemal.xml添加如下:
在java代码中添加如下:
使用luke查看索引如下:
其实添加的话就可以把原来的id重复的给更新掉了,因为id是唯一的
4、如果我们几个字段一起搜索的话可以
但是这种比较麻烦,可以进行配置多值域:
然后把其他域的索引加入到该域中:
修改之后需要重启
如果你直接搜索单词的话,则默认域是如下配置: