찾다
백엔드 개발PHP 튜토리얼集成 PHP 应用和 Solr 搜索引擎

集成 PHP 应用和 Solr 搜索引擎

Mar 24, 2017 pm 01:25 PM
phpsolr애플리케이션검색 엔진통합

你为什么需要搜索引擎?单纯数据库不够用?如果你只是创建小网站,数据库就够了。但当你创建中性或大型应用的时候,搜索引擎是更明智的选择。当然如是一说,小网站也可以利用Solr,获得高相关性的搜索结果。

想象一下你在写一个电子商务网站的搜索查询程序。最直接的想法就是如下的数据库查询语句:

SELECT * FROM PRODUCTS
WHERE LOWER(title) like LOWER('%$phrase%')
OR LOWER(description) like LOWER('%$phrase%');

查询标题或描述中的短语时,它工作正常。但是现实事物很复杂,比如说Apple iPhone 4G black 16GB(苹果4G网络iPhone黑色16GB)。搜索“iPhone 16G”的时候,就没结果。你可以用%替换空格应付这种情况。

$phrase = str_replace(' ', '%', $phrase);

那么查询“iPhone 16GB 4G”的时候呢?显然词序改变了,它又无法正常工作。我猜你又会添加一个字段保存词序。那么写错词怎么办?同义词怎么办?为如此的搜索系统想一个好的解决方案很有挑战性。



设计一个精妙的算法不是解决这类问题的关键. 文本的搜素是需要消耗资源的. 将太多的压力放在数据库端永远不是一个好办法. 原因是数据库不能很方便的扩展. 你不能像web server 或者 Memcached一样,简单的增加一个实例.扩展数据库需要一些准备, 代码的修改, 配置, down机维护时间, 总之成本是非常昂贵的. 好消息是Solr就是专门解决这类问题的.

Solr是一个基于Apache Lucene的企业级搜索平台. 快,稳定, 有很好的文档当然扩展起来也很方便. 由于Solr是有个强大的解决方案, 他的所有特性就不在这篇文章里面一一列举了. 这家伙上收起来也是相当easy哦.


首先从官方网站下载最新的版本。Solr是一个由Java语言编写的应用程序,你需要Java Runtime环境才可以运行。

$ cd solr-4.1.0/example/
$ java -jar start.jar

大概几秒钟后你就可以看到下面的信息:

2013-03-09 18:47:41.177:INFO:oejs.AbstractConnector:Started SocketConnector@0.0.0.0:8983

Solr有一个web界面,工作在8983端口下,打开浏览器访问http://localhost:8983/solr/.

在左手边的导航区你会找到“collection1″。在Solr中,Collections类似于数据库的表,你可以查询数据。点击一个collection,选择她的子菜单 “query”。

第一个选项叫 “Request-Handler (qt)”,拥有默认值 “/select”。Request handlers是一组预定义查询. 如果你查看Solr config文件,你就会看到是这样的:

$ vim solr-4.1.0/example/solr/collection1/conf/solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">text</str>
    </lst></requestHandler>

第二个参数才是我们最感兴趣的。默认值 “*:*” 意味着查询任何内容,如果你点击“execute query” ,你可以得到像下面这样的内容:

<?xml version="1.0" encoding="UTF-8"?><response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
        <lst name="params">
        <str name="indent">true</str>
        <str name="q">*:*</str>
        <str name="wt">xml</str>
        </lst>
    </lst>
    <result name="response" numFound="0" start="0" /></response>

索引结果为空,但这不是什么问题,你需要插入一些示例数据。

$ cd solr-4.1.0/example/exampledocs/
$ java -jar post.jar monitor.xml
 
SimplePostTool version 1.5
Posting files to base url http://localhost:8983/solr/update using content-type application/xml..
POSTing file monitor.xml1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/update..

现在你可以返回查询界面,这次就会有一个文档返回。

Collection的数据结构是在schema文件中定义的。

$ vim solr-4.1.0/example/solr/collection1/conf/schema.xml

这个文件有非常多的注释,你可以很容易分辨出他们是做什么的。如果你要修改scheme文件,请不要删除名叫“text”的字段(如果没很好的理由),他是和另外的字段和查询语句中关联的(包括select, look等等)。

$ grep text solr-4.1.0/example/solr/collection1/conf/schema.xml | grep copy
 
<copyField source="cat" dest="text"/>
<copyField source="name" dest="text"/>
<copyField source="manu" dest="text"/>
<copyField source="features" dest="text"/>
<copyField source="includes" dest="text"/>
<copyField source="title" dest="text"/>
<copyField source="author" dest="text"/>
<copyField source="description" dest="text"/>
<copyField source="keywords" dest="text"/>
<copyField source="content" dest="text"/>
<copyField source="content_type" dest="text"/>
<copyField source="resourcename" dest="text"/>
<copyField source="url" dest="text"/>

如果你使用的是关系数据库,你不希望有重复的数据。Solr不是一个数据库,多数字段也被处理成文本字段,默认request handler就是这样。


从PHP访问Solr需要一个客户端。我建议从PECL下载一个。它快速,API清晰,文档优良。不过要注意,这个扩展现在版本1.0.2,不支持Solr 4.x。Solr 3.x和4.x的协议有微小不同。不过别担心,我已经做了修改,你可以从https://github.com/lukaszkujawa/php-pecl-solr下载兼容版本。我已经用了一段时间,是可靠的。它和官方的有点差别在SolrClient构造函数中多一个Solr版本参数。这个补丁将会发布在官方版本中,你不用担心此后的兼容性。

$ git clone https://github.com/lukaszkujawa/php-pecl-solr.git$ cd php-pecl-solr/
$ phpize
$ whereis php-config
php-config: /usr/bin/php-config /usr/bin/X11/php-config
$ ./configure --with-php-config=/usr/bin/php-config
$ make
$ make install

添加到你的php.ini

extension=solr.so

重启Web服务器

$ /etc/init.d/apache2 restart

现在就可以写php添加内容到索引中了。

<?php
 $options = array (    &#39;hostname&#39; => &#39;127.0.0.1&#39;,
);
 
$client = new SolrClient($options, "4.0"); // 参数4.0针对Solr4.x,其他版本时忽略
 $doc = new SolrInputDocument();
 
$doc->addField(&#39;id&#39;, 100);
$doc->addField(&#39;title&#39;, &#39;Hello Wolrd&#39;);
$doc->addField(&#39;description&#39;, &#39;Example Document&#39;);
$doc->addField(&#39;cat&#39;, &#39;Foo&#39;);
$doc->addField(&#39;cat&#39;, &#39;Bar&#39;);
 
$response = $client->addDocument($doc);
 
$client->commit(); 
/* ------------------------------- */
 $query = new SolrQuery();
 
$query->setQuery(&#39;hello&#39;);
 
$query->addField(&#39;id&#39;)
->addField(&#39;title&#39;)
->addField(&#39;description&#39;)
->addField(&#39;cat&#39;);
 
$queryResponse = $client->query($query);
 
$response = $queryResponse->getResponse();
 
print_r( $response->response->docs );

如果你添加的文档不止一条,她也可以处理得很好,而不需要频繁的commit。

知道Solr如何工作是很有价值的,你可以在很多项目中使用。她有个很棒的功能可以让你一次请求就可以拉取所有需要的数据。当然,你掌握她需要耗费一些时间,但这值得你付出。Solr拥有一个活跃的社区和完整的文档资源,如果你还担心在项目中使用,请翻阅Solr 3 企业搜索服务器,她不仅仅是让你快速搭建起搜索服务,还是你数据挖掘的基础。

相关文章:

php的solr的操作类及demo

安装php-solr扩展

搜索方案 solr+php如何安装配置?

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?Apr 23, 2025 am 12:16 AM

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 어떻게 최적화 할 수 있습니까?PHP 세션 성능을 어떻게 최적화 할 수 있습니까?Apr 23, 2025 am 12:13 AM

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?Apr 23, 2025 am 12:10 AM

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서 세션 이름을 어떻게 구성합니까?PHP에서 세션 이름을 어떻게 구성합니까?Apr 23, 2025 am 12:08 AM

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.