문제

현재는 엄청난 SQL 쿼리보다는 다른 검색 방법을 알아보고 있습니다.나는 보았다 탄성 검색 최근에 같이 놀았어 (검색 엔진의 Python 구현)

당신의 선택에 대한 이유를 제시할 수 있습니까?

도움이 되었습니까?

해결책

Elasticsearch의 제작자로서, 아마도 내가 왜 내가 앞으로 나아 갔는지에 대해 어떤 추론을 할 수있을 것입니다 :).

순수한 루센을 사용하는 것은 어려운 일입니다. 실제로 잘 수행하기를 원한다면 조심해야 할 것이 많으며 도서관이기 때문에 분산 지원이 없으므로 유지해야 할 Java 라이브러리 일뿐입니다.

루센의 유용성 측면에서 (거의 6 년), 나는 나침반을 만들었습니다. 그 목표는 루센을 사용하여 단순화하고 매일 루센을 더 간단하게 만드는 것이 었습니다. 내가 시간과 시간을 다시 만난 것은 나침반을 배포 할 수 있어야한다는 것입니다. 나는 Gigaspaces, Coherence 및 Terracotta와 같은 데이터 그리드 솔루션과 통합하여 Compass 내에서 작업하기 시작했지만 충분하지 않습니다.

핵심적으로 분산 된 루센 솔루션을 샤드해야합니다. 또한 유비쿼터스 API로서 HTTP와 JSON이 발전함에 따라 다른 언어를 가진 많은 다른 시스템을 쉽게 사용할 수있는 솔루션을 의미합니다.

이것이 제가 계속해서 Elasticsearch를 만들었습니다. 매우 고급 분산 모델을 가지고 있으며 JSON을 기본적으로 말하며 JSON DSL을 통해 완벽하게 표현되는 많은 고급 검색 기능을 노출시킵니다.

Solr은 또한 HTTP를 통해 인덱싱/검색 서버를 노출시키는 솔루션이지만 Elasticsearch 훨씬 우수한 분산 모델과 사용 편의성을 제공합니다 (현재 일부 검색 기능은 부족하지만 오랫동안은 아니지만 어쨌든 계획은 모든 것을 얻는 것입니다. 나침반 Elasticsearch에 특징). 물론, 나는 Elasticsearch를 만들었 기 때문에 편견이 있으므로 직접 확인해야 할 수도 있습니다.

Sphinx는 사용하지 않았으므로 댓글을 달 수 없습니다. 내가 당신을 언급 할 수있는 것은 스핑크스 포럼 에서이 스레드 나는 Elasticsearch의 우수한 분산 모델을 증명합니다.

물론 Elasticsearch는 배포하는 것보다 더 많은 기능을 가지고 있습니다. 실제로 클라우드를 염두에두고 제작되었습니다. 사이트의 기능 목록을 확인할 수 있습니다.

다른 팁

나는 Sphinx, Solr 및 Elasticsearch를 사용했습니다. Solr/Elasticsearch는 Lucene 위에 제작되었습니다. 웹 서버 API, FASETING, CACHING 등 많은 일반적인 기능이 추가됩니다.

간단한 전체 텍스트 검색 설정 만하려면 Sphinx가 더 나은 선택입니다.

검색을 전혀 사용자 정의하려면 Elasticsearch와 Solr이 더 나은 선택입니다. 그들은 매우 확장 가능합니다. 결과 점수를 조정하기 위해 자신의 플러그인을 작성할 수 있습니다.

일부 예제 사용 :

  • 스핑크스 : craigslist.org
  • Solr : CNET, Netflix, Digg.com
  • Elasticsearch : Foursquare, Github

우리는 Lucene을 정기적으로 사용하여 수천만 개의 문서를 색인하고 검색합니다.검색은 충분히 빠르며 오랜 시간이 걸리지 않는 증분 업데이트를 사용합니다.여기에 도착하는 데 시간이 걸렸습니다.루센의 강력한 점은 확장 성, 광범위한 기능 및 활발한 개발자 커뮤니티입니다.Bare Lucene을 사용하려면 Java로 프로그래밍이 필요합니다.

새로 시작하는 경우 Lucene 제품군의 도구는 다음과 같습니다. 솔르, 이는 기본 Lucene보다 설정이 훨씬 쉽고 Lucene의 거의 모든 기능을 갖추고 있습니다.데이터베이스 문서를 쉽게 가져올 수 있습니다.Solr는 Java로 작성되었으므로 Solr를 수정하려면 Java 지식이 필요하지만 구성 파일을 조정하는 것만으로도 많은 작업을 수행할 수 있습니다.

또한 특히 MySQL 데이터베이스와 관련하여 Sphinx에 대해 좋은 소식을 들었습니다.그러나 그것을 사용하지 않았습니다.

IMO에서는 다음 사항에 따라 선택해야 합니다.

  • 필수 기능 - 예:프랑스어 형태소 분석기가 필요합니까?Lucene과 Solr에는 하나가 있지만 다른 것에 대해서는 모르겠습니다.
  • 구현 언어 숙련도 - Java를 모른다면 Java Lucene을 건드리지 마세요.Sphinx로 작업하려면 C++가 필요할 수도 있습니다.Lucene도 포팅되었습니다. 다른 언어.이는 검색 엔진을 확장하려는 경우 가장 중요합니다.
  • 실험의 용이성 - 이 측면에서는 Solr가 가장 좋다고 생각합니다.
  • 다른 소프트웨어와의 인터페이스 - Sphinx는 MySQL과 좋은 인터페이스를 가지고 있습니다.Solr는 RESTful 서버로 Ruby, XML 및 JSON 인터페이스를 지원합니다.Lucene은 Java를 통해서만 프로그래밍 방식의 액세스를 제공합니다. 나침반 그리고 최대 절전 모드 검색 Lucene을 더 큰 프레임워크에 통합하는 래퍼입니다.

MySQL 레코드의 10.000.000 +와 10 개 이상의 다른 데이터베이스가있는 수직 검색 프로젝트에서 Sphinx를 사용합니다. MySQL에 대한 매우 우수한 지원과 인덱싱에 대한 고성능, 연구는 빠르지 만 Lucene보다 조금 작을 수 있습니다. 그러나 매일 빠르게 인덱싱하고 MySQL DB를 사용해야한다면 올바른 선택입니다.

내 sphinx.conf

source post_source 
{
    type = mysql

    sql_host = localhost
    sql_user = ***
    sql_pass = ***
    sql_db =   ***
    sql_port = 3306

    sql_query_pre = SET NAMES utf8
    # query before fetching rows to index

    sql_query = SELECT *, id AS pid, CRC32(safetag) as safetag_crc32 FROM hb_posts


    sql_attr_uint = pid  
    # pid (as 'sql_attr_uint') is necessary for sphinx
    # this field must be unique

    # that is why I like sphinx
    # you can store custom string fields into indexes (memory) as well
    sql_field_string = title
    sql_field_string = slug
    sql_field_string = content
    sql_field_string = tags

    sql_attr_uint = category
    # integer fields must be defined as sql_attr_uint

    sql_attr_timestamp = date
    # timestamp fields must be defined as sql_attr_timestamp

    sql_query_info_pre = SET NAMES utf8
    # if you need unicode support for sql_field_string, you need to patch the source
    # this param. is not supported natively

    sql_query_info = SELECT * FROM my_posts WHERE id = $id
}

index posts 
{
    source = post_source
    # source above

    path = /var/data/posts
    # index location

    charset_type = utf-8
}

테스트 스크립트 :

<?php

    require "sphinxapi.php";

    $safetag = $_GET["my_post_slug"];
//  $safetag = preg_replace("/[^a-z0-9\-_]/i", "", $safetag);

    $conf = getMyConf();

    $cl = New SphinxClient();

    $cl->SetServer($conf["server"], $conf["port"]);
    $cl->SetConnectTimeout($conf["timeout"]);
    $cl->setMaxQueryTime($conf["max"]);

    # set search params
    $cl->SetMatchMode(SPH_MATCH_FULLSCAN);
    $cl->SetArrayResult(TRUE);

    $cl->setLimits(0, 1, 1); 
    # looking for the post (not searching a keyword)

    $cl->SetFilter("safetag_crc32", array(crc32($safetag)));

    # fetch results
    $post = $cl->Query(null, "post_1");

    echo "<pre>";
    var_dump($post);
    echo "</pre>";
    exit("done");
?>

샘플 결과 :

[array] => 
  "id" => 123,
  "title" => "My post title.",
  "content" => "My <p>post</p> content.",
   ...
   [ and other fields ]

스핑크스 쿼리 시간 :

0.001 sec.

스핑크스 쿼리 시간 (1K 동시) :

=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)

MySQL 쿼리 시간 :

"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.

MySQL Query Time (1K Concurrent) :

"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)

지금까지 찾을 수 있었던 유일한 Elasticsearch vs Solr Performance 비교는 다음과 같습니다.

Solr vs Elasticsearch 데스 매치!

Lucene은 훌륭하고 전부이지만 그들의 중지 단어 세트는 끔찍합니다. Stopanalyzer.english_stop_words_set에 수동으로 정지 단어를 추가해야했습니다.

나는 Sphinx를 사용하지 않았지만 사람들은 속도와 마법적인 "쉽게 설정의 편리한"비율로 맹세한다는 것을 알고 있습니다.

Indextank를 사용해보십시오.

탄성 검색의 경우에, 루센/솔레보다 사용하기가 훨씬 쉽다고 생각되었다. 또한 고화없이 조정할 수있는 매우 유연한 점수 시스템이 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top