'lucene'에 해당되는 글 71건

  1. 2018.04.06 [Elasticsearch] Split Index 기능 맛보기
  2. 2018.04.06 [Elasticsearch] Elasticsearch Case Study 1) Data 노드에 Index/Shard 구성 시작 해보기
  3. 2018.04.05 [Elasticsearch] 쉽게 Elasticsearch Estimation 하기
  4. 2018.04.04 [Elasticsearch] Contribution 하기 위한 준비 작업
  5. 2018.01.31 [검색] re-ranking 시 사용하는 함수에 주의 하세요.
  6. 2017.12.19 [Lucene] LeafReaderContext 는...
  7. 2017.11.15 [Elasticsearch] elasticsearch-arirang-analyzer-6.0.0 릴리즈
  8. 2017.11.14 [Lucene] Inverted index file - 역인덱스 파일
  9. 2017.11.14 [Elasticsearch] _id mapping 시 path 설정
  10. 2017.10.25 [Lucene] QueryString Parser 간단 살펴보기

[Elasticsearch] Split Index 기능 맛보기

Elastic/ElasticsearchReferences 2018. 4. 6. 14:24

Split index 기능에 대해서 공식 문서에 나와 있는 내용을 그대로 테스트 해봤습니다.

(Shrink 와 Split 은 모두 Resize Action 에 해당 합니다.)


Reference)

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-split-index.html


이 split index API 는 기존에 존재하는 또는 생성된 index 의 primary shard 를 신규 index 로 기존 primary shard 크기 보다 크게 split 해서 생성해 주는 역할을 합니다.


RESTful endpoint 는 _split 입니다.


근데 7.0 에서는 삭제 된다고 하니 제가 이걸 왜 쓰고 있는지 모르겠습니다.

하지만 늘 그렇듯이 Elasticsearch 에서는 기능이 없어지게 되면 대체 가능한 기능을 추가로 제공해 줍니다. :)


이 API 사용시 제일 중요한 부분은 IMPORTANT 에 잘 나와 있습니다.


The _split API requires the source index to be created with a specific number_of_routing_shards in order to be split in the future. This requirement has been removed in Elasticsearch 7.0.


※ Source index 를 생성 할때 설정을 해줘야 한다는 이야기 입니다.


그럼 문서에 나와 있는 데로 한번 돌려 보겠습니다.

하지 전에, elasticsearch 하나 띄워 놓으시고 kibana 도 띄워 놓으세요. 그래야 편하게 dev tool 이용해서 request 할 수 있겠죠.


Step 1) Preparing an index for splitting

Source index 를 생성 하는 과정이며 이 과정에서 반드시 routing shard 정보를 설정 하셔야 합니다.


PUT my_source_index

{

    "settings": {

        "index.number_of_shards" : 1,

        "index.number_of_replicas" : 0,

        "index.number_of_routing_shards" : 2

    }

}


Step 2) Set read-only mode

Split 하기 전에 반드시 읽기 전용으로 반드시 설정을 하셔야 합니다. 안하시면 에러 납니다.

그럼 왜 해야 할까요?

보통 DB 마이그레이션 작업 하실때 생각을 해보시면 됩니다. :)


PUT /my_source_index/_settings

{

  "settings": {

    "index.blocks.write": true 

  }

}


문서를 자세히 보기 전까지 저 설정이 block 단위로 write 할 수 있도록 해주는 설정인 줄 알았습니다. ^^;


Step 3) Splitting an idex

이제 primary shard 를 2 개로 늘려 보겠습니다.


POST my_source_index/_split/my_target_index

{

  "settings": {

    "index.number_of_shards": 2,

    "index.number_of_replicas" : 0

  }

}


이 단계 작업을 하면서 주의 할 점은 당연한 내용이지만, 

1. target index 가 없어야 겠죠.

2. source index 의 primary shard 보다 커야 겠죠.

3. factor 조건을 만족 해야 합니다.


routingNumShards % numTargetShards != 0 이면 안되구요.


if (sourceNumberOfShards < targetNumberOfShards) { // split

factor = targetNumberOfShards / sourceNumberOfShards;

if (factor * sourceNumberOfShards != targetNumberOfShards || factor <= 1) { 이면 안되구요. }

}


즉,

- 나눠서 나머지가 없어야 합니다.

- target shard 는 routing shard 보다 작거나 같아야 합니다.


아래는 factor 조건을 만족하지 않는 예시 입니다.


PUT my_source_index

{

    "settings": {

        "index.number_of_shards" : 1,

        "index.number_of_replicas" : 0,

        "index.number_of_routing_shards" : 4

    }

}


PUT /my_source_index/_settings

{

  "settings": {

    "index.blocks.write": true 

  }

}


POST my_source_index/_split/my_target_index

{

  "settings": {

    "index.number_of_shards": 3,

    "index.number_of_replicas" : 0

  }

}


조건 1) 

4 % 3 => 1 // 0 이 되어야 합니다.


조건 2) 

assert getRoutingFactor(3, 4) >= 0


if ( 3 < 4 ) {

    factor = 4 / 3; // factor = 1

    if ( factor * 3 != 4 || factor <= 1) {

        throw new IllegalArgumentException(.....);

    }

}



혹시라도 사용하셔야 하는 분들이 계시다면 참고 하시면 되겠습니다.

:

[Elasticsearch] Elasticsearch Case Study 1) Data 노드에 Index/Shard 구성 시작 해보기

Elastic/Elasticsearch 2018. 4. 6. 10:13

Elasticsearch Case Study 1) Data 노드에 Index/Shard 구성 시작 해보기

- Data Node 3개, Active Index 1개

- Data Node Spec)

CPU : 16 cores

- 지속적인 Read/Write operaiton 이 발생 하는 경우로 가정 하겠습니다.


Primary/Replica Shard Sizing)

- Shard 구성을 하실 때 가장 쉽게 접근 할 수 있는 방법은 CPU 코어 크기를 가지고 판단 하시면 됩니다.

- Data 노드 하나당 active shard 로 배치 할 수 있는 가장 기본은 코어 크기와 똑같이 구성 하시는 것입니다.


위에 16 코어로 가정했기 때문에 Data 노드에는 16개의 Shard 를 할당 할 수 있습니다.


Elasticsearch Settings 정보)

curl -XPUT http://localhost:9200/case-study-1/_settings '{

    "settings" : {

        "index" : {

            "number_of_shards" : 15,

            "number_of_replicas" : 2

        }

    }

}'


이와 같이 Index 를 생성 하게 되면 아래와 같이 shard 가 배치 됩니다.


Data node 1 : 

Primary Shards : 0, 1, 2, 3, 4

Replica Shards : 5, 6, 7, 8, 9, 10, 11, 12, 13, 14

Data node 2 :

Primary Shards : 5, 6, 7, 8, 9

Replica Shards : 0, 1, 2, 3, 4, 10, 11, 12, 13, 14

Data node 3 :

Primary Shards : 10, 11, 12, 13, 14

Replica Shards : 5, 6, 7, 8, 9, 0, 1, 2, 3, 4


보시게 되면 모든 Data 노드에 Shard 가 15개씩 할당 되어 있는 것을 확인 하실 수 있습니다.

여기까지 확인 하셨으면 이제 부터가 시작 입니다.


Data 노드에 Index, Shard에 대한 기본 설정은 했지만 이게 최적화 된 것인지는 알수 없습니다.

그래서 사용환경에 맞춰서 성능 테스트를 해 보셔야 합니다.


아래 질문에 답변을 해보세요.


1. 내가 사용하고자 하는 클러스터는 질의 및 분석에 최적화 되어야 한다.

2. 내가 사용하고자 하는 클러스터는 색인에 최적화 되어야 한다.

3. 내가 사용하고자 하는 클러스터는 질의, 분석 그리고 색인 모두 최적화 되어야 한다.


1번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

질의 와 분석은 CPU 와 Memory 를 많이 사용하기 때문에 충분한 자원이 준비 되어 있어야 합니다.

그리고 Document 에 대한 mapping 정보 최적화가 필요 합니다.

1. Match query 종류를 사용해야 하는가? (주로 Full text query를 의미 합니다.)

- Elastic 사에서는 Full text queries 라고 합니다.

2. Term query 종류를 사용해야 하는가? (주로 Exact match query를 의미 합니다.)

- Elastic 사에서는 Term level queries 라고 합니다.

3. Aggregation 질의가 많은가?

4. Nested 유형의 Aggregation 질의가 많은가?


2번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

색인 작업은 CPU 와 Disk I/O 성능에 영향을 많이 받습니다.

또한 사용하는 형태소 분석기에 따른 성능 변화도 확인을 하셔야 합니다.


사실 색인에 최적화 라는건 Bulk Indexing 이 아니고서는 다른 주제 인것 같습니다.

로그 데이터의 경우 보통은 Data 노드의 처리량을 고려해서 앞단에 Queue 를 사용하고,

여기서 Beats 나 Logstash 와 같은 Shipper 를 이용해서 Elasticsearch 로 색인하도록 구성을 합니다.

결과적으로 Queue + Beats/Logstash + Elasticsearch 에 대한 최적화 작업 없이는 어려운 작업 입니다.


Elasticsearch 관점에서 바라보면:Bulk Indexing)

1. Dynamic mapping 사용을 피하는게 좋습니다.

2. 불필요한 Analyzed 과정을 제거 하는게 좋습니다.

3. Bulk 요청 시 Replica 와 Refresh 를 사용하지 않는게 좋습니다.

4. _all Field 사용을 피하는게 좋습니다.

5. _id 는 가능 하면 임의 설정을 하지 않는게 좋습니다.

6. Index Buffer Size 를 512MB 정도까지 크게 설정 하는게 좋습니다.

7. 기타 등등 사소한 튜닝 팁들이 많습니다.


3번을 원하신다면 아래 항목들에 대해서 검토를 해보시면 좋습니다.

가장 어려운 요구사항 입니다.

이런 경우 클러스터의 노드와 인덱스 구성을 분리해서 사용하시는게 좋습니다.

1. Cross Cluster Search(Tribe Node) 에 대해서 검토해 봅니다.

2. Hot-Warm Architecture 에 대해서 검토해 봅니다.

3. Index Alias 기능에 대해서 검토해 봅니다.

4. Shrink, Split, Reindex, Rollover, Rollup 기능에 대해서 검토해 봅니다.

5. Snapshot 과 Restore 기능에 대해서 검토해 봅니다.


이번 Case Study 는 아주 단순 합니다.

요구사항은 알수 없고 단순히 Data 노드 규모와 스펙만으로 Index/Shard 배치를 설정 하는 것이였습니다.

"왜 이렇게/저렇게 해야 하지?" 라는 궁금증이 드시는 부분은 이해를 돕기 위해 추가적인 설명이 들어가야 하는데 과감히 생략 했습니다. (커뮤니티에 질문 주시거나 저를 만나시면 물어보세요. 친절히 설명해 드리겠습니다.)


항상 반복 되는 이야기지만,

사용 환경에 맞게 테스트 하시고 최적화 하는게 정답입니다.

시작 하기 전에 조금이나마 도움이 될 수 있는 내용을 작성한 것이지 이대로 하면 된다는 것은 아닙니다.

알아야 할 것도 많고 검증 해야 할 것도 많습니다.

시간과 인력이 부족 하시다면 Elastic 사에서 지원하는 좋은 프로그램들이 있으니 참고 하셔도 좋을 것 같습니다.


궁금 하신 것들이 있으시면 Facebook 유저 커뮤니티에 질문으로 올려 주세요.

제가 할 수 있다면 도움 드릴 수 있도록 하겠습니다.

:

[Elasticsearch] 쉽게 Elasticsearch Estimation 하기

Elastic/Elasticsearch 2018. 4. 5. 15:44

Elasticsearch 를 이용해서 클러스터를 구성 하거나 인덱스를 구성 할 때 아는게 하나도 없는 상황에서 규모에 대한 평가를 하기 위한 기본 정보로 사용하시면 좋을 것 같아 공유 합니다.


기본 전제는 사용하는 환경에 맞게 테스트 및 최적화를 하셔야 합니다.


  • 1 shard around 20GB (max 50GB)


일반적인 서비스용 데이터에 대한 Shard 크기는 최대 20GB 를 넘지 않도록 설계 하시는게 좋으며, 로그 데이터의 경우 50GB 를 넘지 않도록 설계 하시면 됩니다.

이를 기준으로 사용 환경에 맞춰 성능 테스트를 하시고 크기를 최적화 하시면 됩니다.


  • Machine Spec
    • Master ( 1/2 of search ) < Search ( 1/2 of data ) <= Data
    • Minimum Master Node Spec ( m4.large )
      • CPU 2 cores
      • MEM 8GB


장비는 스펙이 좋으면 좋을 수록 좋습니다. 이건 다다익선이죠. 하지만 비용 문제가 있기 때문에 적절한 스펙 선정을 해야 합니다.

장비 하나에 인스턴스 하나를 띄운다고 가정 하고 일반적인 검색엔진 추천 스펙으로 정의 하면) 

장비 스펙이지 노드 스펙이 아닙니다.


  • CPU : 32 cores
  • MEM : 64GB


위 장비 스펙을 Data 노드라고 가정하면,
    • Search(Client) 노드의 장비 스펙은)
      • 32 cores X 32GB
      • 16 cores X 32GB


    • Master 노드의 장비 스펙은)
      • 8 cores X 16GB
      • 4 cores X 16GB


  • Primary Shards
    • CPU core size eq primary shards ( 1/2 of CPU cores )


위에 정리한 내용들의 출발은 알고 있는 정보가 전혀 없다는 가정에서 시작한 것입니다.

처음 시작 하시는 분들에게는 어디서 부터 어떻게 해야 할지 모르기 때문에 시작 할 수 있는 정보가 있다면 조금은 시간낭비나 고민을 덜어 드릴수 있지 않을까 싶어서 공유 합니다.


인덱스와 샤드에 대한 생성과 배치 전략에 대해서도 공유를 드리도록 하겠습니다.

그 전에 아주 옛날에 작성한 글 하나가 있어서 링크 투척하고

[Elasticsearch] replica & shard 이해하기.


약간의 부연 설명만 하고 마무리 하겠습니다.


1. Primary shard

원본 데이터 입니다.

한번 정의 하면 변경 할 수 없으며, 현재는 shrink, split, reindex 등의 API 를 이용해서 뭔가의 조작은 가능 합니다. (이것도 나중에 관련 API 설명을 해야 겠군요..)



2. Replica shard

복제 데이터 입니다.

동적으로 변경이 가능 하며, 장애 방지 및 검색 질의에 대한 throughput 향상에 활용 합니다.

(참고로 Replica shard 는 Primary shard 로 승격이 가능 합니다. - 참고문서)

:

[Elasticsearch] Contribution 하기 위한 준비 작업

Elastic/Elasticsearch 2018. 4. 4. 12:31

Elasticsearch 소스코드를 수정 하거나 디버깅을 하고 싶을 때가 있습니다.

로컬에서 빌드 부터 해야 가능하겠죠.


특별히 contributing 을 목적으로 하지는 않지만, 그래도 이왕이면 버그 수정도 하고 contribution 도 하면 좋겠죠.


아래는 이미 문서에 자세히 나와 있는 내용을 그냥 요약 정도 해본 내용입니다.

(기억을 위해 한번 더 작성해 본 내용입니다.)


Reference)

https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md

https://github.com/elastic/elasticsearch/blob/master/TESTING.asciidoc


사전 준비 도구)

- JDK 10 다운로드 및 설치 (Build 용)

- JDK 8 다운로드 및 설치 (Runtime 용)

- Gradle 4.3 다운로드 및 설치


JDK 10 설치 후 환경변수 설정)

$ vi .bash_profile

export JAVA_HOME=$(/usr/libexec/java_home)

export RUNTIME_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home


Intellij 환경설정)

This can be achieved by adding the -Didea.no.launcher=true JVM option. 

IntelliJ, go to Run->Edit Configurations...->Defaults->JUnit->VM options and input -ea.

$ ./gradlew idea


Formatting 설정)

- Java indent is 4 spaces

- Line width is 140 characters

- IntelliJ: Preferences/Settings->Editor->Code Style->Java->Imports

- Class count to use import with '*' and Names count to use static import with '*'. Set their values to 99999


Elasticsearch run)

$ ./gradlew run


# 실행 시 9200과 9300 port 로 실행 중인 elasticsearch daemon 이 있으면 에러 발생 합니다.


Logging level 설정)

# path : distribution/src/config/log4j2.properties


$ vi log4j2.properties

ASIS)

rootLogger.level = info


TOBE)

rootLogger.level = debug


Create distribution)

$ ./gradlew assemble

$ ./gradlew check


:

[검색] re-ranking 시 사용하는 함수에 주의 하세요.

ITWeb/검색일반 2018. 1. 31. 11:19

Elasticsearch 나 Solr 나 모두 내장 함수를 제공 하고 있습니다. (Lucene function 이기도 합니다.)

그런데 이 내장 함수를 이용해서 re-ranking 작업을 많이들 하시는 데요.

하는건 문제가 없지만 시스템 리소스에 영향을 주거나 성능적으로 문제가 되는 함수는 사용하지 않도록 주의 하셔야 합니다.

그냥 무심코 사용했다가 왜 성능이 안나오지 하고 맨붕에 빠지실 수 있습니다.

Function Score Query 나 Script 를 이용한 re-ranking 시 꼭 검토하세요.

re-ranking 은 보통 질의 시점에 수행을 하기 때문에 기본적으로 operation cost 가 비쌉니다.


lucene/queries/function/valuesource

TermFreqValueSource.java)

/**
* Function that returns {@link org.apache.lucene.index.PostingsEnum#freq()} for the
* supplied term in every document.
* <p>
* If the term does not exist in the document, returns 0.
* If frequencies are omitted, returns 1.
*/
public class TermFreqValueSource extends DocFreqValueSource {
public TermFreqValueSource(String field, String val, String indexedField, BytesRef indexedBytes) {
super(field, val, indexedField, indexedBytes);
}

@Override
public String name() {
return "termfreq";
}

@Override
public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
Fields fields = readerContext.reader().fields();
final Terms terms = fields.terms(indexedField);

return new IntDocValues(this) {
PostingsEnum docs ;
int atDoc;
int lastDocRequested = -1;

{ reset(); }

public void reset() throws IOException {
// no one should call us for deleted docs?

if (terms != null) {
final TermsEnum termsEnum = terms.iterator();
if (termsEnum.seekExact(indexedBytes)) {
docs = termsEnum.postings(null);
} else {
docs = null;
}
} else {
docs = null;
}

if (docs == null) {
docs = new PostingsEnum() {
@Override
public int freq() {
return 0;
}

@Override
public int nextPosition() throws IOException {
return -1;
}

@Override
public int startOffset() throws IOException {
return -1;
}

@Override
public int endOffset() throws IOException {
return -1;
}

@Override
public BytesRef getPayload() throws IOException {
throw new UnsupportedOperationException();
}

@Override
public int docID() {
return DocIdSetIterator.NO_MORE_DOCS;
}

@Override
public int nextDoc() {
return DocIdSetIterator.NO_MORE_DOCS;
}

@Override
public int advance(int target) {
return DocIdSetIterator.NO_MORE_DOCS;
}

@Override
public long cost() {
return 0;
}
};
}
atDoc = -1;
}

@Override
public int intVal(int doc) {
try {
if (doc < lastDocRequested) {
// out-of-order access.... reset
reset();
}
lastDocRequested = doc;

if (atDoc < doc) {
atDoc = docs.advance(doc);
}

if (atDoc > doc) {
// term doesn't match this document... either because we hit the
// end, or because the next doc is after this doc.
return 0;
}

// a match!
return docs.freq();
} catch (IOException e) {
throw new RuntimeException("caught exception in function "+description()+" : doc="+doc, e);
}
}
};
}
}



:

[Lucene] LeafReaderContext 는...

ITWeb/검색일반 2017. 12. 19. 18:36

검색 질의가 들어 오게 되면 아래와 같은 Object 들이 생성이 되고 수행을 하게 됩니다.

개념적으로 flow 를 적어 본 것이고 자세한 건 IndexSearcher 클래스를 참고하세요.

Query

IndexSearcher

IndexReader

IndexreaderContext

List<LeafReaderContext>

LeafSlices

1. search(...)

Query, CollectorManager

2. search(...)

LeafReaderContext, Collector

return TopFieldDocs


여기서 가장 중요한건 아래 부분 입니다.

Query -> IndexReader -> LeafReaderContext:LeafReader (One LeafReader per Segment)


:

[Elasticsearch] elasticsearch-arirang-analyzer-6.0.0 릴리즈

Elastic/Elasticsearch 2017. 11. 15. 23:49

페북에 올렸더니 스팸 이라고 삭제 당했내요. ㅡ.ㅡ;

https://github.com/HowookJeong/elasticsearch-analysis-arirang/tree/6.0.0

https://github.com/HowookJeong/elasticsearch-analysis-arirang/releases/download/6.0.0/elasticsearch-analysis-arirang-6.0.0.zip


설치 방법은 잘 아시겠지만 두 가지 입니다.

$ bin/elasticsearch-plugin install file:///elasticsearch-analysis-arirang-6.0.0.zip

$ bin/elasticsearch-plugin install https://github.com/HowookJeong/elasticsearch-analysis-arirang/releases/download/6.0.0/elasticsearch-analysis-arirang-6.0.0.zip


적용된 version 은 아래와 같습니다.

elasticsearch-6.0.0

lucene-7.0.1

arirang.lucene-analyzer-7.0.1

arirang.morph-1.1.0


혹시 arirang plugin 을 어떻게 만드는지 궁금하신 분들은 아래 글 참고하세요.

[Elasticsearch] Arirang Analyzer + Elasticsearch Analyzer Plugin 사용자 관점 개발리뷰


:

[Lucene] Inverted index file - 역인덱스 파일

ITWeb/검색일반 2017. 11. 14. 23:15

루씬에서 검색을 하기 위해 필요한 파일을 살짝 알아보겠습니다.

파일 구조와 목록은 아래 문서를 참고 하시기 바랍니다.

Lucene Index File Formats)

https://lucene.apache.org/core/7_1_0/core/org/apache/lucene/codecs/lucene70/package-summary.html#package.description


그럼 실제 검색을 위해 보셔야 하는 기본이 되는 클래스는 

  • IndexSearcher
  • IndexReader
  • CollectionStatistics
  • TermStatistics

이렇게 4개 정도 보시면 될 것 같습니다.


검색을 위해 필요한 정보는

  • Documents
  • Fields
  • Terms
  • FieldInvertState

이렇게 4개 정도가 필요 합니다.

딱 봐도 "searchField:elasticsearch" 하면 

  • searchField 라는 field 정보가 필요하고, 
  • elasticsearch 라는 term 관련 정보도 필요하고, 
  • elasticsearch 라는 term 이 있는 document 정보도 필요하고,
  • 해당 field 에서의 term 이 추출 된 offset과 position 정보가

필요합니다.


이걸 정리한 이유는 오늘 누가 custom function score query 를 사용하여 다수의 field 에 대한 ranking term boosting 기능을 사용하고 있는데 성능적으로 개선 할 수 있는 방법이 없는지 물어봐서 간단하게 정리해봤습니다.

Query 튜닝은 한계가 반드시 존재 합니다.

서버의 구조적인 개선과 튜닝을 병행해야 하며 다수의 field 에 대한 다수의 term boosting 은 최적화를 통해 최소화 해서 사용하는걸 추천 드립니다.

그리고 inverted index file 이라는 것은 루씬에서 하나의 파일만 이야기 하는 것이 아니라 lucene 이 가지고 있는 index file 목록들이 inverted index file 을 구성 한다고 보시면 될 것 같습니다.

:

[Elasticsearch] _id mapping 시 path 설정

Elastic/Elasticsearch 2017. 11. 14. 11:13

_id 에 사용하시는 데이터의 primary key 값을 지정 하고 싶을때가 많이 있습니다.

기억이 가물가물해서 잠시 찾아 봤는데요.

2.4 까지는 path 설정 기능이 살아 있었는데 5.X 들어 가면서 삭제 되었습니다.


2.4)

private String path = Defaults.PATH;


public Builder() {

    super(Defaults.NAME, new FieldType(Defaults.FIELD_TYPE));

    indexName = Defaults.INDEX_NAME;

}


public Builder path(String path) {

    this.path = path;

    return builder;

}


그래서 _id field 에 primary key 를 넣고 싶으실 경우  IndexRequestBuilder.setId() 를 이용하시거나 JSON 파일 만드실 때 _id field 에 primary key 값을 넣어 주시면 됩니다.


:

[Lucene] QueryString Parser 간단 살펴보기

ITWeb/검색일반 2017. 10. 25. 13:11

초간단 기억용으로 막 작성했습니다.


[QueryString Parser]

() - group

(jakarta OR apache) AND website

field:() - field group

title:(+return +"pink panther")

{} - range query - exclusive

[] - range query - inclusive

"" - exact term (non_analyzed)

field:something somthing - match query (analyzed)

? - single character

* - 0 or more chracters

~ - levenshtein distance query (fuzzy query)

""~10 - slop position gap within 10 words (proximity query)

something - boolean query

+something - must have something

-something - must not have something

^ - boosting

OR operator OR or ||

AND operator AND, && or +

NOT operator NOT, ! or -


dismax query parser

https://lucene.apache.org/solr/guide/6_6/the-dismax-query-parser.html

: