개발관련/Lucene,ElasticSearch 2015. 10. 30. 15:27


루씬은 document기반의 저장방식으로 각 document의 field를 색인 하게 된다. 

색인은 각 분석기의 특징대로 색인을 하며, 검색 시 그 색인을 기반으로 검색하게 된다. 

db와 틀린점은 머 내생각이니 다음과 같은데... 

1. db는 특정 컬럼에 값을 insert 한다는 개념이 강하다. 루씬은 insert 한다가 아닌 

특정 컬럼을 어떻게 색인할 것인가로 접근하는게 맞는듯 보인다. 

2. field추가가 자유롭다. 여느 nosql도 마찬가지겠지만, 루씬 역시, 특정 컬럼을 추가할 때 field를 추가하면된다. 

3. 색인은 특정 값이 아닌 문장 단위의 것들로 한다. 물론 아닐경우도 있지만, 색인은 문장 자체를 설정된 분석기로 색인을 하는것이다. 

이때문에 단순한 컬럼은 색인을 하지 않는다. 이유는 !! 검색엔진 이니까! 

4. 검색 시 쿼리는 가공(?)을 해야한다. 물론 단순한 값을 할 경우는 필요없지만, lucene을 제대로 사용할려면, 검색 키워드를 가공을 하여 검색할 경우 더 큰 빚을 발휘 하는듯 보인다. ex) lucene 를 검색 시 lucening로 검색 하면 좋지 않을까? 머 이딴거..... 

머 이정도 인듯 보인다.

위에 그림은 전형적인 루씬의 그림으로 index는 index document 과정이 필요하고, 검색 시는 search가 필요하다. 


ps: 아마도 뒤에 lucene 관련 내용은 3.6 기반으로 설명할 것이다.(버전이 중요함.. ㅠㅠ)



posted by 제스트
:
개발관련/MongoDB 2015. 10. 30. 14:05

lucene 과 마찬가지로 몽고 디비 역시 update는 미존재 한다. 그러나 api 는 지원 고로 remove후 다시 쓴다는 개념이다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//update
db.userCollection.update(
        {
            "user": "zest133"
        },
  
        {
                "user" : "gno",
                "name" :"gno",
                "phone" : "111-1111-1111",
                "idx" : 1
            }
  
    }
//select all
db.userCollection.find()
cs

위에 코드와 같이 첫번째 object는 set을 의미 , 두번째 object는 where절 쯤 (?) 으로 생각. 

쿼리를 날리고 결과를 확인하면 기존의 row가 두번재 object 형태로 변경된다.  이때, 이상한 점이 발견될 듯. update가 아니라 걍 delete 후 insert한 결과 형태로 변경된다. 


그럼 변경하고 싶은 컬럼만 바꾸고 싶다면? 다음과 같이 하면 된다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//update
 db.userCollection.update(
        {
            "user": "gno"
        },
        {
            $set :{
                "user" : "gno",
                "name" :"gno",
                "phone" : "111-1111-1111",
                "idx" : 1
            }
        }
    )
//select all
db.userCollection.find()
cs

두번째 object 에 $set이라는 내장 변수(?)를 써서 쿼리를 던지면 rdb의 update처럼 변경된다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
//$inc = plus, minus 
    //$mul = mutiply, divide
    //
    db.userCollection.update(
        {
            "user": "gno"
        },
        {
            $mul :{
                
                "idx" : 1/2
            }
        }
    )    
cs

또, 숫자를 변경하고 싶다면, $mul을 사용해서 사용. 

1
2
3
4
5
6
7
8
9
10
11
db.userCollection.update(
        {
            "user": "gno"
        },
        {
            $unset :{
                
                "phone" : 1
            }
        }
    )          
cs

특정 컬럼을 제거 하고 싶다면 $unset을 해주고 컬럼 : 1 을 해준다. '1'은 true라는 개념인듯 하다. 


1
2
3
4
5
6
7
8
9
10
db.userCollection.update(
        {
            "user": "gno"
        },
        {
            $set :{
                "family" : ['mom','bro','sis']
            }
        }
    )                
cs

배열 형태로 바꾸거나 추가 할 컬럼은 위와 같이 사용하면된다. 


삭제시 remove 라는 api를 이용해 삭제 

1
2
3
4
5
6
//delete
db.userCollection.remove(
        {
                "user":"gno"
        }
)                   
cs


posted by 제스트
:
개발관련/MongoDB 2015. 10. 30. 13:45

몽고 db는 기본적으로 json 구조를 쓰며 js와 매우 흡사한 형태(?)로 query 를 날린다. 

내부 api를 이용하여 만드는 구조인듯 보인다. 

머 몽고 db역시 document 구조라 lucene과 비슷한 형태 

Collection은 table, document 는 일종의 row , column은 field로 칭한다. 


다음과 같이 쿼리를 날리면 특정 db를 사용하게 된다. 만약 db가 없으면 생성하게 된다. 

1
2
use testDB
 
cs

insert 시 db.사용할 컬렉션.insert() 를 하면 row가 생성된다. 이때, 컬렉션이 존재 하지 않으면 생성 하면서 저장하게 된다. 

type은 string, date, double 를 지원한듯 보인다.  

1
2
3
4
5
6
7
8
9
10
11
//insert query 
db.userCollection.insert(
 {
     "user":"zest133",
     "pwd" :"zest133",
     "name" :"zest133",
     "email": "zest133@test.com",
     "date" : new Date()
 }
)
 
cs


색인 컬럼은 다음과 같이 설정. 

1
2
3
4
5
6
7
//insert index
 db.userCollection.ensureIndex(
    {
        "user" : 1
    }
 )
 
cs


배열 색인은 다음과 같이 설정. 

1
2
3
4
5
6
  //create array index   
 db.userCollection.createIndex(
    {
        "family" : 1
    }
 )              
cs

createIndex를 사용하여, 특정 json array 컬럼 :1 을 하면된다. 재미난 점은 배열안에 값들이 내부적으로 색인이 된다. 


posted by 제스트
: