solr跟elasticSearch的区别:
1.solr对单机和少量集群比较快,elasticSearch对大量集群比较快
2.solr对实时搜索不太友好,elasticSearch对实时搜索非常友好
3.solr的后台是Apache有一个成熟的社区,而elasticSearch相对较新
solr的域使用:
注意:solr中的域,必须先在solrhome/索引库/config/schema.xml中声明才能使用
solr中的域:
声明域:
<field name="item_title" type="text_ik" index="true" stored="true" multiValued="false"/>
name="item_title" :给域起个名字。域名。
type="text_ik" :域的类型,域的类型也是要先声明后使用的。----- 是否要分词?
indexed="true" :是否索引?
stored="true" :是否要存储?
multiValued="true" :是否多值?可选的
复制域:(默认搜索域)
<field name="item_keywords" type="text_ik" indexed="true" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
source=一个已经定义好的域名,当这个域进行存储的时候,会将索引复制一份到item_keywords中,这样搜索item_keywords就可以搜索到item_title存储的索引,再从item_title中将存储的内容返回
动态域:当不知道有多少域,或不知道域名叫什么的时候,就用动态域。
<dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>
name="attr_*":域名,* 通配符,只要是以attr_开头的域,都认。
ID域:唯一!!必须存在!!
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
required="true":必须有的
<uniqueKey>id</uniqueKey>唯一的。
SolrTemplate API
@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-solr.xml")
@SuppressWarnings("ALL")
public class SolrTest{
@Autowired
private SolrTemplate solrTemplate;
@Test //保存,修改
public void testSaveBean(){
TbItem item = new TbItem();
solrTemplate.saveBean(item);
}
@Test //批量保存,修改
public void testSaveBeans(){
List list = new ArrayList<>();
TbItem item = new TbItem();
list.add(item);
solrTemplate.saveBeans(list);
}
@Test //根据主键id删除
public void testDeleteById(){
solrTemplate.deleteById("1");
}
@Test //清空索引库,根据查询结果删除
public void testDelete(){
solrTemplate.delete(new SimpleQuery("*:*"));
}
@Test //分页查询
public void testQueryForPage(){
Query query = new SimpleQuery();
query.setOffset(0); //开始的索引(默认0),等同于mysql的limit
query.setRows(10); //每页显示的记录数(默认10)
ScoredPage<TbItem> scoredPage = solrTemplate.queryForPage(query,TbItem.class);
//查询结果的总记录数
System.out.println("总记录数:"+scoredPage.getTotalElements());
//分页查询的结果的集合
List<TbItem> litemList = scoredPage.getContent();
}
@Test //分页条件查询
public void testQueryForPageAndCondition(){
...
Cirteria criteria = new Criteria("item_title").is("华为");
criteria.and("item_title").contains("1");
query.addCriteria(criteria);
...
}
is和contains的区别:
is和contains都相当于一个term,但是is只会对指定的field原样查询,contains会对指定的field先分词再查询
eg: 华为Mate20 -->is("华") 无法匹配 -->contains("华") 匹配成功
}
TbItem实体类
1.@Field注解的value属性值对应field标签的name属性值,主键id不需要value
2.solr中的域必须先在solrhome/schema.xml中配置声明
public class TbItem implements Serializable{
@Field
private Long id;
@Field("item_title")
private String title;
@Dynamic
@Field("item_*")
private String itemList;
.....
}
依赖及配置
1.maven依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
2.配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>