目录
2.3.6 controller层(JdController)
- <properties>
- <java.version>1.8java.version>
-
- <elasticsearch.version>7.6.1elasticsearch.version>
- properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <scope>runtimescope>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-elasticsearchartifactId>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.71version>
- dependency>
- dependencies>
- @Configuration
- public class ElaticsearchConfig {
- //该对象可以对ES进行相关的操作
- @Bean
- public RestHighLevelClient restHighLevelClient(){
- RestHighLevelClient client=new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
- return client;
- }
- }
这些操作可以在测试类中编写

类型名可以不写,这样的话默认为_doc,这样就不会显示过期提示了。此处图例只是为了举例,更方便理解代码。

- @Autowired
- private RestHighLevelClient restHighLevelClient;
- //PUT /索引名称
- //索引的操作
- @Test
- void contextLoads() throws IOException {
- //1.创建索引
- CreateIndexRequest createIndexRequest=new CreateIndexRequest("wd_my");
- CreateIndexResponse createIndexResponse=restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
- //查看创建是否成功,打印结果为true,去客户端查看全部,看是否创建
- System.out.println(createIndexResponse.isAcknowledged());
- restHighLevelClient.close();
- }

- @Autowired
- private RestHighLevelClient restHighLevelClient;
-
- @Test
- public void test02() throws IOException {
- //索引的删除
- DeleteIndexRequest deleteIndexRequest=new DeleteIndexRequest("wd_my");
- AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
- boolean acknowledged = delete.isAcknowledged();
- System.out.println(acknowledged);
- restHighLevelClient.close();
- }
- @Autowired
- private RestHighLevelClient restHighLevelClient;
-
- @Test
- public void test01() throws IOException {
- //索引的获取,并判断其是否存在
- GetIndexRequest indexRequest=new GetIndexRequest("wd_my");
- boolean exists = restHighLevelClient.indices().exists(indexRequest, RequestOptions.DEFAULT);
- System.out.println(exists);
-
- restHighLevelClient.close();
- }

- @Autowired
- private RestHighLevelClient restHighLevelClient;
-
- @Test
- public void test03() throws IOException {
- //文档的添加
- IndexRequest indexRequest=new IndexRequest("wd_my");
- indexRequest.id("1");
- User user=new User("肖可可",15);
- indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
- IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
- System.out.println(index.status());
- System.out.println(index);
-
- restHighLevelClient.close();
- }

- @Autowired
- private RestHighLevelClient restHighLevelClient;
-
- @Test
- public void test04() throws IOException {
- //测试获得文档的信息
- GetRequest getRequest=new GetRequest("wd_my","1");
- GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
- //打印文档内容
- System.out.println(getResponse);
- //返回的全部内容和命令是一样的
- System.out.println(getRequest);
- restHighLevelClient.close();
- }
- @Autowired
- private RestHighLevelClient restHighLevelClient;
- @Test
- public void test05() throws IOException {
- //文档的获取,并判断是否存在 2返回的是false 1返回的是true
- GetRequest getRequest=new GetRequest("wd_my","2");
- boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
- System.out.println(exists);
- restHighLevelClient.close();
- }

- @Autowired
- private RestHighLevelClient restHighLevelClient;
- @Test
- public void test07() throws IOException {
- //删除文档
- DeleteRequest deleteRequest=new DeleteRequest("wd_my","1");
- DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
- System.out.println(delete.status());
- restHighLevelClient.close();
- }
- @Autowired
- private RestHighLevelClient restHighLevelClient;
- @Test
- public void test06() throws IOException {
- //更新文档
- UpdateRequest updateRequest=new UpdateRequest("wd_my","1");
- User user=new User("肖海洋",27);
- updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
- UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
- System.out.println(update.status());
- restHighLevelClient.close();
- }
- //批量添加文档
- @Test
- public void testBuck() throws Exception{
- BulkRequest bulk=new BulkRequest("wd_my");
- List
list=new ArrayList<>(); - list.add(new User("2","张三","北京",22));
- list.add(new User("3","李四","上海",20));
- list.add(new User("4","王五","杭州",25));
- list.add(new User("5","赵六","广州",27));
- list.add(new User("6","孙七","南京",29));
-
- //list.stream().forEach(item->bulk.add(new IndexRequest().id(item.getId()).source(JSON.toJSONString(item),XContentType.JSON)));
- for(User user:list){
- IndexRequest indexRequest=new IndexRequest();
- indexRequest.id(user.getId());
- indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
- bulk.add(indexRequest);
- }
-
-
-
- BulkResponse bulkResponse = client.bulk(bulk,RequestOptions.DEFAULT);
- System.out.println(bulkResponse.hasFailures());
- }
- //搜索查询---GET /索引/_search
- // {
- // "query":{
- // "":{}
- // },
- // "from":
- // "size":
- // "_source":["",""],
- // "sort":{}
-
- // }
-
- //1. 搜索请求对象SearchRequest
- //2. 构建一个条件对象SearchSourceBuilder
- //3. 把条件对象放入搜索请求对象中
- //4. 执行搜索功能
- @Test
- public void testSearch() throws Exception{
- //
- SearchRequest searchRequest=new SearchRequest("wd_my");
- //创建一个条件对象
- SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
- TermQueryBuilder matchQuery = QueryBuilders.termQuery("name", "张");
- sourceBuilder.query(matchQuery);
-
- //分页
- sourceBuilder.from(0);
- sourceBuilder.size(1);
-
- //排序
- // sourceBuilder.sort("age");
-
- //高亮
- HighlightBuilder highlightBuilder=new HighlightBuilder();
- highlightBuilder.field("name");
- highlightBuilder.preTags("");
- highlightBuilder.postTags("");
- sourceBuilder.highlighter(highlightBuilder);
-
- searchRequest.source(sourceBuilder);
-
-
- SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
-
- System.out.println("总条数:"+searchResponse.getHits().getTotalHits().value);
- SearchHit[] hits = searchResponse.getHits().getHits();
-
- Arrays.stream(hits).forEach(item-> System.out.println(item.getSourceAsString()));
- Arrays.stream(hits).forEach(item-> System.out.println(item.getHighlightFields()));
- }



- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-elasticsearchartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
-
- <dependency>
- <groupId>org.jsoupgroupId>
- <artifactId>jsoupartifactId>
- <version>1.11.3version>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.75version>
- dependency>
- dependencies>
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class CommonResult {
- private Integer code;
- private String msg;
- private Object data;
- }
- @Configuration
- public class ESConfig {
-
- @Bean
- public RestHighLevelClient restHighLevelClient(){
- RestHighLevelClient restHighLevelClient=new RestHighLevelClient(RestClient.builder(
- new HttpHost("localhost",9200,"http")
- ));
- return restHighLevelClient;
- }
- }
- public class HtmlParseUtil {
- public static List
parseJd(String keyword) throws Exception { - // public static void main(String[] args) throws Exception{
- String path="https://search.jd.com/Search?keyword="+keyword;
- //Document整个网页对象
- Connection con = Jsoup.connect(path).userAgent(
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")
- .timeout(30000); // 设置连接超时时间
- Document document = con.get();
- //System.out.println(document);
- //查询所有的商品信息
- Element j_goodsList = document.getElementById("J_goodsList");
- //获取某一块的商品信息
- Elements li = j_goodsList.getElementsByTag("li");
-
- List
list=new ArrayList<>(); - for (Element element : li) {
- String price = element.getElementsByClass("p-price").eq(0).text();
- //System.out.println(price);
- String pname = element.getElementsByClass("p-name").eq(0).text();
- //System.out.println(pname);
- String img = element.getElementsByTag("img").eq(0).attr("data-lazy-img");
- //System.out.println(img);
- String title = element.getElementsByClass("p-shopnum").eq(0).text();
- //System.out.println(title);
-
- list.add(new Product(pname,price,img,title));
- }
- return list;
-
- }
- }
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class Product {
- private String pname;
- private String price;
- private String imgUrl;
- private String title;
- }
- @RestController
- @CrossOrigin//解决跨域问题
- @RequestMapping("/jd")
- public class JdController {
-
- @Autowired
- private JdService jdService;
-
- @GetMapping("/export/{keyword}")
- public CommonResult export(@PathVariable String keyword) throws Exception{
- return jdService.export(keyword);
- }
-
- @GetMapping("/search/{keyword}/{pageNum}/{pageSize}/{sortType}")
- public CommonResult search(@PathVariable String keyword,@PathVariable Integer pageNum,@PathVariable Integer pageSize,@PathVariable(required = false) String sortType) throws Exception{
- System.out.println(sortType);
- return jdService.search(keyword,pageNum,pageSize,sortType);
- }
-
-
- }
- @Service
- public class JdService {
-
- @Autowired
- private RestHighLevelClient restHighLevelClient;
-
- public CommonResult export(String keyword) throws Exception {
-
- List
list = HtmlParseUtil.parseJd(keyword); - BulkRequest bulkRequest=new BulkRequest("jd-index");
-
- for (Product product : list) {
- IndexRequest indexRequest=new IndexRequest();
- indexRequest.source(JSON.toJSONString(product), XContentType.JSON);
- bulkRequest.add(indexRequest);
- }
-
- BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
- if(bulkResponse.hasFailures()){
- return new CommonResult(5000,"添加文档失败",null);
- }else{
- return new CommonResult(2000,"添加文档成功",null);
- }
- }
-
- public CommonResult search(String keyword,Integer pageNum,Integer pageSize,String name) throws IOException {
- List
- SearchRequest searchRequest=new SearchRequest("jd-index");
- //放置内容
- SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
- MatchQueryBuilder matchQueryBuilder= QueryBuilders.matchQuery("pname",keyword);
- searchSourceBuilder.query(matchQueryBuilder);
- //排序
- if(name!=null){
- searchSourceBuilder.sort(name, SortOrder.ASC);
- }
- //分页
- searchSourceBuilder.from(pageNum);
- searchSourceBuilder.size(pageSize);
- //高亮
- HighlightBuilder highlightBuilder=new HighlightBuilder();
- highlightBuilder.field("pname");
- highlightBuilder.preTags("");
- highlightBuilder.postTags("");
-
- searchSourceBuilder.highlighter(highlightBuilder);
-
- searchRequest.source(searchSourceBuilder);
-
- SearchResponse searchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
-
- SearchHit[] hits = searchResponse.getHits().getHits();
- //获取total总数
- Long total = searchResponse.getHits().getTotalHits().value;
- for (SearchHit hit : hits) {
- Map
map=hit.getSourceAsMap(); - //获取高亮字段
- Map
highlightFields = hit.getHighlightFields(); - HighlightField pname = highlightFields.get("pname");
- //获取对应的文本内容
- Text[] fragments = pname.getFragments();
- StringBuilder stringBuilder=new StringBuilder();
- for (Text fragment : fragments) {
- stringBuilder.append(fragment);
- }
- map.put("pname",stringBuilder);
- list.add(map);
- }
- HashMap
map = new HashMap<>(); - map.put("total",total);
- map.put("data",list);
- return new CommonResult(2000,"查询成功",map);
- }
- }
IK分词器是ES的一个插件,主要用于把一段中文或者英文的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词器是将每个字看成一个词,比如"我爱技术"会被分为"我","爱","技","术",这显然不符合要求,所以我们需要安装中文分词器IK来解决这个问题;
IK提供了两个分词算法:ik_smart和ik_max_word
ik_smart为最少切分,添加了歧义识别功能,推荐;
ik_max_word为最细切分,能切的都会被切掉;
GET /_analyze
{
"text":"你爱学习,天天向上",
"analyzer":"ik_max_word"
}

GET /_analyze
{
"text":"你爱学习,天天向上",
"analyzer":"ik_smart"
}

添加自定义词语:
在许多情况下会有一些专业数据,例如:
"于敏为祖国奉献一生", ik_smart分词后的结果是:

而于敏是人名,被拆分开来了,需要将其作为一个词语添加到词典中;
在IK目录下有config文件夹,用于存储词典;
创建一个文件: mydict.dic , 在里面添加"于敏"


然后要是想将多个词语放置其中,只需要使用entry键隔开:

注意:配置完成后,要重启elasticsearch搜索引擎。
除此之外:要删除对应的索引,重新创建索引。

- <template>
- <div class="page">
- <div id="app" class=" mallist tmall- page-not-market ">
-
- <div id="header" class=" header-list-app">
- <div class="headerLayout">
- <div class="headerCon ">
-
- <div class="header-extra">
-
- <div id="mallSearch" class="mall-search">
- <form name="searchTop" class="mallSearch-form clearfix">
- <fieldset>
- <legend>天猫搜索legend>
- <div class="mallSearch-input clearfix">
- <div class="s-combobox" id="s-combobox-685">
- <div class="s-combobox-input-wrap">
- <input v-model="keyword" type="text" autocomplete="off" id="mq"
- class="s-combobox-input" aria-haspopup="true">
- div>
- div>
- <button type="submit" @click.prevent="searchKey" id="searchbtn">搜索button>
- div>
- fieldset>
- form>
- <ul class="relKeyTop">
- <li><a @click="search('java')">javaa>li>
- <li><a @click="search('vue')">vuea>li>
- <li><a @click="search('c#')">c#a>li>
- <li><a @click="search('c++')">c++a>li>
- <li><a @click="search('javascript')">javascripta>li>
- ul>
- div>
- div>
- div>
- div>
- div>
-
- <div id="content">
- <div class="main">
-
- <form class="navAttrsForm">
- <div class="attrs j_NavAttrs" style="display:block">
- <div class="brandAttr j_nav_brand">
- <div class="j_Brand attr">
- <div class="attrKey">
- 品牌
- div>
- <div class="attrValues">
- <ul class="av-collapse row-2">
- <li><a href="#"> vue a>li>
- <li><a href="#"> Java a>li>
- ul>
- div>
- div>
- div>
- div>
- form>
-
- <div class="filter clearfix">
- <a class="fSort fSort-cur">综合<i class="f-ico-arrow-d">i>a>
- <a class="fSort">人气<i class="f-ico-arrow-d">i>a>
- <a class="fSort">新品<i class="f-ico-arrow-d">i>a>
- <a class="fSort">销量<i class="f-ico-arrow-d">i>a>
- <a class="fSort" @click="sort('price')">价格<i class="f-ico-triangle-mt">i><i class="f-ico-triangle-mb">i>a>
- div>
-
- <div class="view grid-nosku" >
- <div class="product" v-for="item in results">
- <div class="product-iWrap">
-
- <div class="productImg-wrap">
- <a class="productImg">
- <img :src="item.imgUrl">
- a>
- div>
-
- <p class="productPrice">
- <em>{{item.price}}em>
- p>
-
- <p class="productTitle">
- <a v-html="item.pname"> a>
- p>
-
- <div class="productShop">
- <a v-html="item.title"> a>
- div>
-
- <p class="productStatus">
- <span>月成交<em>999笔em>span>
- <span>评价 <a>3a>span>
- p>
- div>
- div>
- div>
- div>
- div>
-
-
- <el-pagination
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- :current-page="pageNum"
- :page-sizes="pageSizes"
- :page-size="pageSize"
- layout="total, sizes, prev, pager, next, jumper"
- :total="tal">
- el-pagination>
- div>
- div>
- template>
-
- <script>
- export default {
- name: "jd",
- data(){
- return {
- keyword: '', // 搜索的关键字
- results:[], // 后端返回的结果
- sortType:'',
- //分页
- pageNum:1,
- pageSize:5,
- pageSizes:[],
- tal:0,
- }
- },
- methods:{
- search(keyword){
- this.keyword = keyword;
- this.searchKey();
- },
- sort(sortType){
- this.sortType = sortType;
- this.searchKey();
- },
- searchKey(){
- var keyword = this.keyword;
- this.$http.get('/jd/search/'+keyword+"/"+this.pageNum+"/"+this.pageSize+"/price").then(response=>{
- this.results=response.data.data.data;
- console.log(this.results);
- let sizes = [];
- this.tal = response.data.data.total;
- let page = this.tal%5 === 0 ? this.tal/5 : this.tal/5+1;
- sizes.push(1);
- for(let i=1; i<=page; i++){
- sizes.push(5*i);
- }
- this.pageSizes = sizes;
- })
- },
- //分页部分内容
- handleSizeChange(val) {
- this.pageSize = val;
- this.searchKey();
- },
- handleCurrentChange(val) {
- this.pageNum = val;
- this.searchKey();
- },
- }
-
- }
- script>
对应样式
- <style>
- /*** uncss> filename: http://localhost:9090/css/global.css ***/
- body,button,fieldset,form,h1,input,legend,li,p,ul{
- margin:0;padding:0
- }
- body,button,input{
- font:12px/1.5 tahoma,arial,"\5b8b\4f53";
- -ms-overflow-style:scrollbar
- }
- button,h1,input{
- font-size:100%
- }
- em{
- font-style:normal
- }
- ul{
- list-style:none
- }
- a{
- text-decoration:none;
- cursor: pointer;
- }
- a:hover{
- text-decoration:underline
- }
- legend{
- color:#000
- }
- fieldset,img{
- border:0
- }
- #content,#header{
- margin-left:auto;margin-right:auto
- }
- html{
- zoom:expression(function(ele){ ele.style.zoom = "1"; document.execCommand("BackgroundImageCache", false, true); }(this))}@font-face{font-family:mui-global-iconfont;src:url(//at.alicdn.com/t/font_1401963178_8135476.eot);src:url(//at.alicdn.com/t/font_1401963178_8135476.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_1401963178_8135476.woff) format('woff'),url(//at.alicdn.com/t/font_1401963178_8135476.ttf) format('truetype'),url(//at.alicdn.com/t/font_1401963178_8135476.svg#iconfont) format('svg')}#mallPage{width:auto;min-width:990px;background-color:transparent}#content{width:990px;margin:auto}#mallLogo{float:left;z-index:9;padding-top:28px;width:280px;height:64px;line-height:64px;position:relative}.page-not-market #mallLogo{width:400px}.clearfix:after,.clearfix:before,.headerCon:after,.headerCon:before{display:table;content:"";overflow:hidden}#mallSearch legend{display:none}.clearfix:after,.headerCon:after{clear:both}.clearfix,.headerCon{zoom:1}#mallPage #header{margin-top:-30px;width:auto;margin-bottom:0;min-width:990px;background:#fff}#header{height:122px;margin-top:-26px!important;background:#fff;min-width:990px;width:auto!important;position:relative;z-index:1000}#mallSearch #mq,#mallSearch fieldset,.mallSearch-input{position:relative}.headerLayout{width:990px;padding-top:26px;margin:0 auto}.header-extra{overflow:hidden}#mallSearch{float:right;padding-top:25px;width:390px;overflow:hidden}.mallSearch-form{border:solid #FF0036;border-width:3px 0 3px 3px}.mallSearch-input{background:#fff;height:30px}#mallSearch #mq{color:#000;margin:0;z-index:2;width:289px;height:20px;line-height:20px;padding:5px 3px 5px 5px;outline:0;border:none;font-weight:900;background:url(data:image/gif;base64,R0lGODlhAQADAJEAAObm5t3d3ff39wAAACH5BAAAAAAALAAAAAABAAMAAAICDFQAOw==) repeat-x;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#mallSearch button{position:absolute;right:0;top:0;width:90px;border:0;font-size:16px;letter-spacing:4px;cursor:pointer;color:#fff;background-color:#FF0036;height:30px;overflow:hidden;font-family:'\5FAE\8F6F\96C5\9ED1',arial,"\5b8b\4f53"}#mallSearch .s-combobox{height:30px}#mallSearch .s-combobox .s-combobox-input:focus{outline:0}button::-moz-focus-inner{border:0;padding:0;margin:0}.page-not-market #mallSearch{width:540px!important}.page-not-market #mq{width:439px!important}
- /*** uncss> filename: http://localhost:9090/css/test.css ***/#mallSearch{float:none}.page-not-market #mallLogo{width:280px}.header-list-app #mallSearch{width:448px!important}.header-list-app #mq{width:347px!important}@media (min-width:1210px){#header .headerCon,#header .headerLayout,.main{width:1190px!important}.header-list-app #mallSearch{width:597px!important}.header-list-app #mq{width:496px!important}}@media (min-width:600px) and (max-width:800px) and (orientation:portrait){.pg .page{min-width:inherit!important}.pg #mallPage,.pg #mallPage #header{min-width:740px!important}.pg #header .headerCon,.pg #header .headerLayout,.pg .main{width:740px!important}.pg #mallPage #mallLogo{width:260px}.pg #header{min-width:inherit}.pg #mallSearch .mallSearch-input{padding-right:95px}.pg #mallSearch .s-combobox{width:100%!important}.pg #mallPage .header-list-app #mallSearch{width:auto!important}.pg #mallPage .header-list-app #mallSearch #mq{width:100%!important;padding:5px 0 5px 5px}}i{font-style:normal}.main,.page{position:relative}.page{overflow:hidden}@font-face{font-family:tm-list-font;src:url(//at.alicdn.com/t/font_1442456441_338337.eot);src:url(//at.alicdn.com/t/font_1442456441_338337.eot?#iefix) format('embedded-opentype'),url(//at.alicdn.com/t/font_1442456441_338337.woff) format('woff'),url(//at.alicdn.com/t/font_1442456441_338337.ttf) format('truetype'),url(//at.alicdn.com/t/font_1442456441_338337.svg#iconfont) format('svg')}::selection{background:rgba(0,0,0,.1)}*{-webkit-tap-highlight-color:rgba(0,0,0,.3)}b{font-weight:400}.page{background:#fff;min-width:990px}#content{margin:0!important;width:100%!important}.main{margin:auto;width:990px}.main img{-ms-interpolation-mode:bicubic}.fSort i{background:url(//img.alicdn.com/tfs/TB1XClLeAY2gK0jSZFgXXc5OFXa-165-206.png) 9999px 9999px no-repeat}#mallSearch .s-combobox{width:auto}::-ms-clear,::-ms-reveal{display:none}.attrKey{white-space:nowrap;text-overflow:ellipsis}.attrs{border-top:1px solid #E6E2E1}.attrs a{outline:0}.attr{background-color:#F7F5F5;border-color:#E6E2E1 #E6E2E1 #D1CCC7;border-style:solid solid dotted;border-width:0 1px 1px}.attr ul:after,.attr:after{display:block;clear:both;height:0;content:' '}.attrKey{float:left;padding:7px 0 0;width:10%;color:#B0A59F;text-indent:13px}.attrKey{display:block;height:16px;line-height:16px;overflow:hidden}.attrValues{position:relative;float:left;background-color:#FFF;width:90%;padding:4px 0 0;overflow:hidden}.attrValues ul{position:relative;margin-right:105px;margin-left:25px}.attrValues ul.av-collapse{overflow:hidden}.attrValues li{float:left;height:22px;line-height:22px}.attrValues li a{position:relative;color:#806F66;display:inline-block;padding:1px 20px 1px 4px;line-height:20px;height:20px;white-space:nowrap}.attrValues li a:hover{color:#ff0036;text-decoration:none}.brandAttr .attr{border:2px solid #D1CCC7;margin-top:-1px}.brandAttr .attrKey{padding-top:9px}.brandAttr .attrValues{padding-top:6px}.brandAttr .av-collapse{overflow:hidden;max-height:60px}.brandAttr li{margin:0 8px 8px 0}.brandAttr li a{text-overflow:ellipsis;overflow:hidden}.navAttrsForm{position:relative}.relKeyTop{padding:4px 0 0;margin-left:-13px;height:16px;overflow:hidden;width:100%}.relKeyTop li{display:inline-block;border-left:1px solid #ccc;line-height:1.1;padding:0 12px}.relKeyTop li a{color:#999}.relKeyTop li a:hover{color:#ff0036;text-decoration:none}.filter i{display:inline-block;overflow:hidden}.filter{margin:10px 0;padding:5px;position:relative;z-index:10;background:#faf9f9;color:#806f66}.filter i{position:absolute}.filter a{color:#806f66;cursor:pointer}.filter a:hover{color:#ff0036;text-decoration:none}.fSort{float:left;height:22px;line-height:20px;line-height:24px\9;border:1px solid #ccc;background-color:#fff;z-index:10}.fSort{position:relative}.fSort{display:inline-block;margin-left:-1px;overflow:hidden;padding:0 15px 0 5px}.fSort:hover,a.fSort-cur{color:#ff0036;background:#F1EDEC}.fSort i{top:6px;right:5px;width:7px;height:10px;line-height:10px}.fSort .f-ico-arrow-d{background-position:-22px -23px}.fSort-cur .f-ico-arrow-d,.fSort:hover .f-ico-arrow-d{background-position:-30px -23px}i.f-ico-triangle-mb,i.f-ico-triangle-mt{border:4px solid transparent;height:0;width:0}i.f-ico-triangle-mt{border-bottom:4px solid #806F66;top:2px}i.f-ico-triangle-mb{border-top:4px solid #806F66;border-width:3px\9;right:6px\9;top:12px}:root i.f-ico-triangle-mb{border-width:4px\9;right:5px\9}i.f-ico-triangle-mb,i.f-ico-triangle-mt{border:4px solid transparent;height:0;width:0}i.f-ico-triangle-mt{border-bottom:4px solid #806F66;top:2px}i.f-ico-triangle-mb{border-top:4px solid #806F66;border-width:3px\9;right:6px\9;top:12px}:root i.f-ico-triangle-mb{border-width:4px\9;right:5px\9}.view:after{clear:both;content:' '}.productImg,.productPrice em b{vertical-align:middle}.product{position:relative;float:left;padding:0;margin:0 0 20px;line-height:1.5;overflow:visible;z-index:1}.product:hover{overflow:visible;z-index:3;background:#fff}.product-iWrap{position:absolute;background-color:#fff;margin:0;padding:4px 4px 0;font-size:0;border:1px solid #f5f5f5;border-radius:3px}.product-iWrap *{font-size:12px}.product:hover .product-iWrap{height:auto;margin:-3px;border:4px solid #ff0036;border-radius:0;-webkit-transition:border-color .2s ease-in;-moz-transition:border-color .2s ease-in;-ms-transition:border-color .2s ease-in;-o-transition:border-color .2s ease-in;transition:border-color .2s ease-in}.productPrice,.productShop,.productStatus,.productTitle{display:block;overflow:hidden;margin-bottom:3px}.view:after{display:block}.view{margin-top:10px}.view:after{height:0}.productImg-wrap{display:table;table-layout:fixed;height:210px;width:100%;padding:0;margin:0 0 5px}.productImg-wrap a,.productImg-wrap img{max-width:100%;max-height:210px}.productImg{display:table-cell;width:100%;text-align:center}.productImg img{display:block;margin:0 auto}.productPrice{font-family:arial,verdana,sans-serif!important;color:#ff0036;font-size:14px;height:30px;line-height:30px;margin:0 0 5px;letter-spacing:normal;overflow:inherit!important;white-space:nowrap}.productPrice *{height:30px}.productPrice em{float:left;font-family:arial;font-weight:400;font-size:20px;color:#ff0036}.productPrice em b{margin-right:2px;font-weight:700;font-size:14px}.productTitle{display:block;color:#666;height:14px;line-height:12px;margin-bottom:3px;word-break:break-all;font-size:0;position:relative}.productTitle *{font-size:12px;font-family:\5FAE\8F6F\96C5\9ED1;line-height:14px}.productTitle a{color:#333}.productTitle a:hover{color:#ff0036!important}.productTitle a:visited{color:#551A8B!important}.product:hover .productTitle{height:14px}.productShop{position:relative;height:22px;line-height:20px;margin-bottom:5px;color:#999;white-space:nowrap;overflow:visible}.productStatus{position:relative;height:32px;border:none;border-top:1px solid #eee;margin-bottom:0;color:#999}.productStatus span{float:left;display:inline-block;border-right:1px solid #eee;width:39%;padding:10px 1px;margin-right:6px;line-height:12px;text-align:left;white-space:nowrap}.productStatus a,.productStatus em{margin-top:-8px;font-family:arial;font-size:12px;font-weight:700}.productStatus em{color:#b57c5b}.productStatus a{color:#38b}.productImg-wrap{position:relative}.product-iWrap{min-height:98%;width:210px}.view{padding-left:5px;padding-right:5px}.view{width:1023px}.view .product{width:220px;margin-right:33px}@media (min-width:1210px){.view{width:1210px;padding-left:5px;padding-right:5px}.view .product{width:220px;margin-right:20px}}@media (min-width:600px) and (max-width:800px) and (orientation:portrait){.view{width:775px;padding-left:5px;padding-right:5px}.view .product{width:220px;margin-right:35px}}.product{height:372px}.grid-nosku .product{height:333px}
-
- style>
