나중에 추가 :
왜 Solr 서비스를 사용 하는가, 왜 Luncence를 사용합니까?
문제는 다음과 같습니다. 쇼핑 웹 사이트를 방문 할 때 관련 콘텐츠를 쿼리하려는 콘텐츠를 기반으로 키워드를 입력 할 수 있습니다. 어떻게해야합니까? 이러한 랜덤 데이터는 데이터베이스 필드를 기반으로 쿼리 할 수 없습니다. 그들은 어떻게 쿼리됩니까? 모든 종류의 이상한 키워드를 쿼리 할 수있는 이유는 무엇입니까?
답은 전체 텍스트 검색 도구의 구현이며 Luncence는 Word-Relement 매칭 및 단어 세분화를 사용합니다. For example: Beijing Tiananmen Square------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- So we can search it when we search.
특정 지능형 알고리즘에 따르면, Ikanalyzer 중국어 단어 세그먼트 인 Ikanalyzer 중국어 단어 세그먼트 인 단어 세그먼트가 있습니다.
이것은 Solr을 사용하는 것의 가장 큰 이점입니다 : 검색 함수의 구현.
사용 단계;
(1) Solr 서버는 Java5를 사용하여 개발되므로 JDK 및 Tomcat이 필요하기 때문에 Solr Server가 구축되었습니다. 빌드 및 배포
(2) 시공이 완료된 후에는 Solr 라이브러리에 표시 할 필드를 소개해야합니다. 프로젝트가 시작될 때 Spring 및 Solr을 Solr을 시작하도록 구성하십시오.
(3) 데이터베이스의 쿼리 컨텐츠를 Solrj 클라이언트에서 구현 한 Solr Index 라이브러리로 가져옵니다. 구체적으로 사용하려면 API를 참조하십시오
(4) 클라이언트 통화에 대한 검색 서비스를 설정합니다. 컨텐츠를 쿼리하려면 Solr을 호출하면 페이징 기능이 구현됩니다. Solr Highlighting의 구현.
(5) 클라이언트는 페이지의 요청 매개 변수를 수신하고 검색 서비스를 호출하고 검색을 수행합니다.
비즈니스 필드 판단 기준 :
1.이 필드에서 검색이 필요한지 여부. 예 : 제품 이름, 제품 판매 지점, 제품 설명
(이들은 라벨을 Solr에 제공하는 것과 동일합니다. 제품 데이터를 가져 오면 Solr은 해당 제품의 특정 콘텐츠를 이러한 필드에서 나누고 관련 컨텐츠를 검색 할 수 있습니다).
2.이 분야가 후속 비즈니스에 필요한지 여부. 예 : 제품 ID.
필수 필드 :
1. 제품 ID
2. 제품 제목
3. 판매 포인트
4. 가격
5. 제품 사진
6. 제품 카테고리 이름
7. 제품 설명
Solr의 비즈니스 분야 :
1. ID-》 제품 ID
다른 해당 필드는 Solr의 필드를 만듭니다.
<field name = "item_title"type = "text_ik"indexed = "true"stored = "true"/> <필드 이름 = "item_sell_point"type = "text_ik"indexed = "true"stored = "true"/<필드 이름 = "item_price"type = "long"indexed = "true" "stord" "true" "field"/> <field "/> indexed = "false"stored = "true" /> <field name = "item_category_name"type = "string"indexed = "true"stored = "true" /<field name = "item_desc"type = "text_ik"indexed = "true"stored = "field _ kneped ="text_kywords "type"indexed = "true" "stored" "stored" multivalued = "true"/> <copyfield source = "initem_title"dest = "item_keywords"/> <copyfield source = "item_sell_point"dest = "item_keywords"/> <coptrefield source = "item_category_name"vesist = "item_keywords"/> <copyfield source = "item_desc"dest = "item_kewords"/>>> <kkeywords "/>. dest = "item_keywords"/> <copyfield source = "item_desc"dest = "item_keywords"/>
Tomcat을 다시 시작하십시오
Solr은 Java에서 개발 된 Apache의 최고의 오픈 소스 프로젝트이며 Lucene을 기반으로 한 전체 텍스트 검색 서버입니다. Solr은 루센보다 더 풍부한 쿼리 언어를 제공하며 동시에 구성 가능하고 확장 가능하며 인덱스 및 검색 성능을 최적화합니다.
Solr은 전체 텍스트 검색 서버이며 구성을 통해서만 전체 텍스트 검색 서비스를 실현할 수 있습니다. 데이터베이스에 대한 빈번한 액세스로 인해 데이터베이스의 압력을 효과적으로 줄입니다.
1 단계 : Linux 시스템에 Solr을 배치하십시오.
2 단계 : Solrj는 Solr의 클라이언트이며 Solrj의 JAR 패키지에 의존해야합니다.
3 단계 : 데이터베이스의 컨텐츠를 Solr의 색인 라이브러리에 추가하여 쿼리가 데이터베이스가 아닌 인덱스 라이브러리에 쿼리되도록합니다.
컨트롤러 계층 :
@controller @requestmapping ( "/manager") public class itemcontroller {@autowired private itemervice itemervice; @requestmapping ( "/importAll") @ResponseBody public taotaoresult importAllitem () {taotaoresult result = itemservice.importallitem (); 반환 결과; }} <br> 서비스 계층 쓰기 : <br> 멀티 테이블 쿼리 제품, 페이지에 표시된 논리 쓰기 : <br> mapper.java 패키지 com.taotao.search.mapper; Java.util.list 가져 오기; com.taotao.search.pojo.item import; public 인터페이스 itemmapper {list <item> getItemList (); }mappper.xml
<? xml version = "1.0"encoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namper.scearch.search.seachor.search.search.search.search.search.search.search.search.search.seachor.seacho. id = "getItemList"resultType = "com.taotao.search.pojo.item"> select A.Id, A.Title, A.Sell_Point, A.Price, A.Image, b. tb_item의 이름 범주 _name a a.cid = b.id </select> </mapper>의 왼쪽 join tb_item_cat b join
4 단계 : 인덱스 라이브러리에서 쿼리 논리를 작성하십시오.
// 인덱스 라이브러리에서 제품 정보를 얻습니다. 이제이 DAO 계층은 인덱스 라이브러리에서 정보를 얻는 것입니다. 이전의 쓰기 로직은 DB의 데이터를 인덱스 라이브러리로 가져 오는 것이었기 때문입니다. 후속 쿼리는 데이터베이스 @RepositoryPublic 클래스 SearchDaoimpl이 SearchDao {@autowired 개인 Solrserver Solrserver; @override public searchResult search (solrquery query) 예외 {// 이것은 index library queryResponse reponship = solrserver.query (query)에서 쿼리를 직접 실행하는 것입니다. // Query solrDocumentList documentList = response.getResults ()의 결과를 가져옵니다. searchResult result = new SearchResult (); // 총 레코드 수를 얻는 것입니다. 목록 <itele itemlist = new ArrayList <> (); // 제품의 강조 표시는 마우스가 단어로 이동할 때 글꼴이 색상이 변경된다는 것입니다. 이것은 <string, map <string, list <string >>> himighting = respons.gethighlighting ()입니다. for (solrdocument solrdocument : docum item.setId ((String) solrDocument.get ( "id")); // 강조 표시는 제목 목록 <string> list = highlighting.get입니다 (solrdocument.get ( "id")). get ( "item_title"); 끈; if (list! = null && list.size ()> 0) {title = list.get (0); } else {title = (string) solrDocument.get ( "item_title"); } item.settitle (제목); item.setPrice ((Long) solrDocument.get ( "item_price")); item.setImage ((String) solrDocument.get ( "item_image")); item.setCategory_Name ((String) solrDocument.get ( "item_category_name")); item.setsell_point ((String) solrdocument.get ( "item_sell_point")); ItemList.add (항목); } result.setitemList (itemList); 반환 결과; }}5 단계 : 인덱스 라이브러리 컨텐츠가 설정되면 외부 서비스 인터페이스 작성, 즉 휴대 전화와 같은 조건을 통해 특정 제품을 검색하면 전체 휴대폰 목록 정보, 어떤 페이지, 페이지 수 및 검색 결과 수가 표시됩니다.
요청 된 URL :
/search/query? q = {쿼리 조건} & page = {page} & rows = {rows}
반환 된 결과 : Taotaoresult 패키지 제품 목록.
SQL 문에 해당하는 pojo를 만들고 별도로 pojo를 만듭니다.
설치에 사용되는 내용 목록 :
공개 클래스 항목 {개인 문자열 ID; 개인 문자열 제목; 개인 문자열 sell_point; 개인 긴 가격; 개인 문자열 이미지; 개인 문자열 카테고리 _name; 개인 문자열 item_des; }컨트롤러 계층 :
@ControllerPublic 클래스 SearchController {@autowired private searchService searchService; @requestmapping (value = "/query", method = requestmethod.get) @ResponseBody public taotaoresult search (@requestparam ( "q") String QueryString, @requestParam (defaultValue = "1") Integer 페이지, @requestparam (defaultValue = "60") {// query rows) (StringUtils.isblank (QueryString)) {return taotaoresult.build (400, "쿼리 조건이 비어있을 수 없음"); } searchResult searchResult = null; try {querystring = new String (querystring.getBytes ( "iso8859-1"), "UTF-8"); SearchResult = SearchService.Search (QueryString, Page, Rows); } catch (예외 e) {e.printstacktrace (); taotaoresult.build (500, exception.getStacktrace (e))를 반환합니다. } return taotaoresult.ok (SearchResult); }}} <br> <br> <br> 1 <span style = "font-size : 16px"> 서비스 계층 : solrj의 solrqurery를 사용하여 쿼리 : </span>전제 조건은 인덱스 라이브러리에서 데이터를 읽는 방법을 작성하는 것입니다.
다음은 서비스의 인터페이스 계층입니다.
제어 장치:
@ControllerPublic 클래스 SearchController {@autowired private searchService searchService; @requestmapping (value = "/query", method = requestmethod.get) @ResponseBody public taotaoresult search (@requestparam ( "q") String QueryString, @requestParam (defaultValue = "1") Integer 페이지, @requestparam (defaultValue = "60") {// query rows) (StringUtils.isblank (QueryString)) {return taotaoresult.build (400, "쿼리 조건이 비어있을 수 없음"); } searchResult searchResult = null; try {querystring = new String (querystring.getBytes ( "iso8859-1"), "UTF-8"); SearchResult = SearchService.Search (QueryString, Page, Rows); } catch (예외 e) {e.printstacktrace (); taotaoresult.build (500, exception.getStacktrace (e))를 반환합니다. } return taotaoresult.ok (SearchResult); }} @ServicePublic 클래스 SearchServiceImpl은 SearchService {@autowired private searchDao searchDao; @override public searchResult Search (String QueryString, int page, int rows)는 예외 {solrquery query = new Solrquery (); Query.setQuery (QueryString); query.setstart ((페이지 -1)*행); query.setrows (행); // 기본 쿼리 검색 필드, 즉 Default Query Query.set ( "df", "item_keywords")을 설정합니다. // 하이라이트 쿼리를 설정합니다 .Sethighlight (true); query.addhighlightfield ( "item_title"); query.sethighlightsimplepre ( "<em style =/"color : red/">"); query.sethighlightsimplepost ( "</em>"); // query searchResult SearchResult = SearchDao.Search (Query)를 실행합니다. // 결과를 기준으로 제품의 얼마나 많은 페이지 수를 계산하십시오 Long PageCount = RecordCount/Rows; if (recordCount % 행> 0) {pageCount ++; } searchResult.setPageCount (pageCount); SearchResult.setCurpage ((Long) 페이지); SearchResult 리턴; }}클라이언트는 제품을 입력하여 검색 기능을 구현합니다.
컨트롤러 계층 :
@제어 장치
공개 클래스 SearchController {@autowired private searchService searchService; @requestmapping ( "/search") public String search (@requestparam ( "q") String QueryString, @requestparam (defaultValue = "1") 정수 페이지, 모델 모델) {if (QueryString! = null) {QueryString = new String (QueryString.get.getByTes ( "ISO8859-1"); } catch (UnsupportedEncodingException e) {e.printstacktrace (); }} searchResult SearchResult = SearchService.Search (QueryString, Page); // Pass Parameters Model.AdDattribute ( "Query", QueryString); //model.addattribute("totalpages ", searchResult.getPageCount ()); model.addattribute ( "itemList", searchResult.getItemList ()); model.addattribute ( "페이지", 페이지); "검색"을 반환합니다. }}서비스 계층 :
@ServicePublic Class SearchServiceImpl은 SearchService {@Value ( "$ {search_base_url}") private String exect_base_url; @override public searchResult Search (String QueryString, int page) {// 여기에 필요한 것은 연결 + 매개 변수입니다. 각 페이지에 표시된 레코드 수는 전달되거나 전달 될 수 있습니다. // taotao-search // 쿼리 매개 변수 맵 <string, string> param = new Hashmap <> (); param.put ( "Q", QueryString); param.put ( "page", page + ""); try {// 서비스 문자열을 호출 json = httpclientutil.doget (search_base_url, param); // 문자열을 Java Object Taotaoresult taotaoresult = taotaoresult.formattopojo (json, searchresult.class)로 변환합니다. SearchResult result = (SearchResult) taotaoresult.getData (); 반환 결과; /* if (taotaoresult.getStatus () == 200) {}*/} catch (예외 e) {e.printstacktrace (); 널 리턴; }}}Solr을 사용하여 제품 검색 기능을 실현하기 위해 위의 기사는 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.