본문 바로가기

반응형

전체 글

(441)
[Node.js Error] Request path contains unescaped characters 지하철 주소 api를 가져오는데 아래와 같은 에러가 나왔다. 찾아보니 url에 한글이 들어가서 나오는 에러!! [ERROR] : Request path contains unescaped characters const stinNm = '강남'; const addressRequestUrl = `http://openapi.kric.go.kr/openapi/convenientInfo/stationInfo?serviceKey=${apiKey}&stinNm=${stinNm}`; 아래처럼 endoceURI() 로 바꿔주니 에러가 해결되었다 const stinNm = encodeURI('강남');
[Elasticsearch] bulk insert (index, create), update, delete with node.js Elasticsearch Bulk with Node.js 이번 bulk코드를 작성해보면서 느낀게 엘라스틱서치는 뭔가 정보가 많지 않은 (?) 느낌이다.(공식 문서는 있지만,,,) node.js, JS, TS, mongoDB 등 자료가 되게 많은 거였구나~ 생각이 들었다. 그래서 정리해본 Node.js + Elasticsearch + Bulk I feel like there isn't much information about Elasticsearch on Google unlike JS, TS, mongoDB etc. So I decided to record what I tried. BEFORE THAT, 먼저 clinet 연결을 해둔다. first, connect to the client. const cl..
[Elasticsearch] index alias란? alias 설정, 추가, 수정, 삭제하기 Alias란 ? What is Alias in Elasticsearch ? Alias란 data stream 또는 indices에 대한 두번째 이름(별칭)이다. 대부분의 ES APIs는 data stream 또는 index 이름 대신에 alias를 받는다. Alias를 사용하는 주된 목적은 어플리케이션 코드에 정지시간(downtime) 또는 어떤 변화없이 데이터를 reindex (copy) 할 수 있다는 것이다. Elasticsearch 의 Index mapping, setting 등의 메타데이터를 수정하기가 쉽지 않아서 새로운 인덱스를 생성한 후 reindex 해주는 방식을 사용할 수 있다. 그런데 reindex가 진행되는 시간이 길어지는 경우 원래의 index를 사용할 수 없다. -> 이는 실제 운영..
[Elasticsearch] Monstache config script _id override / mongoDB의 특정 필드를 ES _id로 지정하기 MongoDB에서 Elasticsearch 로 데이터를 옮기는 와중, ES의 _id가 MongoDB의 _id와 동일하게 들어간다는 것을 발견하고 ES의 _id를 field 중 유일한 pk인 buildingManagementNo로 설정해서 다시 monstache insert 하기로 했다. Few days ago, I did migrate over 10 millions documents from MongoDB to Elasticsearch by using Monstache. But it was found out that _id of ES document was the same as _id of MongoDB so I reinserted data from MongoDB with different config...
[Error] Unable to boot device in current state: Booted Unable to boot device in current state: Booted Xcode simulator를 키는데 위와 같은 에러가 나왔다. 구동된게 이미 있다고 알려주는 것 같다. Error in Xcode while running (build + run ios) project in simulator. 전체 디바이스들을 리스트로 쭉 뽑아서 그 중에 "booted"인 디바이스의 Id를 shutdown해준다. To solve this error : Get the list of devices xcrun simctl list Now you can see which is "booted" or "shutdown" find the booted one and copy the id and shut it down..
[Elasticsearch] elasticdump ended with error BAD_REQUEST : no settings to update elasticdump 중 나온 에러 an Error In the middle of elasticdump my command was : elasticdump --input ~ --output ~ type=analyzer error: ended with error BAD_REQUEST : no settings to update 말그대로 Settings가 없다고....,., 이상하게 이 바로 이전에는 type=analyzer 로 되었었는데 이번엔 안된다. 이 에러가 나와도 index가 이미 생성이 되어 있어서 index 삭제 후 진행해야 한다. It means literally there is no settings. I have no idea why this time ( type=analyzer) gave ..
[Elasticsearch/Elasticdump] missing authentication credentials for REST request Elasticdump를 진행 중에 마주친 에러 Error I got while doing Elasticdump Elasticsearch missing authentication credentials for REST request Authentication이 필요하다. This errer is given when it is not properly authenticated. username과 비밀번호를 입력해주거나 add your username and password like below or --input=http://name:password@{host}:{port}/{index} apikey를 헤더 옵션으로 넣어주면 된다. add your apikey by using the option, header..
[Elasticsearch] Elasticdump 사용법 / 인덱스에서 다른 인덱스로 데이터 옮기기 how to move elasticsearch data from one server to another Elasticsaerch to Elasticsearch migration how to move elasticsearch data from one server to another A의 analyzer, mapping, data를 B로 옮기기 Copy an index from A to B with analyzer and mapping : 1. analyzer analyzer를 가져온다. elasticdump --input={protocol}://{host}:{port}/{index} --output={protocol}://{host}:{port}/{index} --type=analyzer * output (데이터를 받는) 서버에 index가 없어도 자동으로 생성해 준다. Elasticdump will cre..
[Elasticsearch] nori, ngram tokenizer, shingle filter 사용하기 실습 Elasticsearch NGram, Shingle, Nori Tokenizer (decompound_mode: discard & mixed ) 차이 알아보기 실습 1. test_search라는 인덱스 settings - ngram, shingle, nori 사용하고 싶은대로 설정하기 PUT test_search { "settings": { "index": { "analysis": { "filter": { "shingle_max_3": { "type": "shingle", "max_shingle_size": 3, "token_seperator": "" } }, "analyzer": { "nori_analyzer_discard": { "tokenizer": "nori_t_discard" }, "nori_a..
[Elasticsearch] NGram, edge ngram, shingle에 대해 NGram 문자열 중 지정된 길이의 문자들을 출력한다. 빠른 검색을 위해 사용될 용어들 (단어)들 미리 분리해서 역 인덱스에 저장한다. 공백을 사용하지 않는 언어들을 다룰 때 유용하다. 최소 값은 길이 1에서 최대 길이 2이다. (min_gram : 1, max_gram : 2) "house" 를 2글자의 nGram으로 처리하면 "ho", "ou", "us", "se" 총 4개의 토큰이 추출된다. 이 4가지의 토큰들 모두 검색 토큰으로 저장되고 검색어 "ho"라고만 검색을 하더라도 "house"가 포함된 도큐먼트들이 반환된다. min_gram : 2, max_gram : 3 인 경우 왼쪽과 같다. * ngram 토큰 필터를 사용하면 위처럼 저장되는 텀의 갯수가 기하급수적으로 늘어난다. 일반적인 텍스트 검..
[MongoDB] mongoDB 데이터 Monstache을 사용하여 elasticsearch로 이동시키기 mongoDB 데이터 약 1,000만건을 Monstache를 이용하여 Elasticsearch로 옮기기! 1. git clone https://github.com/rwynn/monstache.git 2. cd monstache 3. go install 4. make * 뭔가 잘 되었는데 마지막에 이런 에러가 났다. 근데 그냥 무시하고 진행해도 되었다! 5. cd build/darwin-amd64 6. monstache -v => 만약 zsh: commant not found: monstach 에러가 나온다면 ./monstache -v 으로 "./"을 추가해서 해보니 되었다. 7. build/darwin-amd64 위치에서 vi config.toml 환경설정 파일 작성 # connection settin..
[Elsticsearch] health check & version 버전 확인하기 Elasticsearch 헬스 체크 & 버전 확인하기 elasticsearch 상태 체크 curl http://localhost:9200/_cluster/health\?pretty elasticsearch 버전 확인하기 1. XGET 사용 * cluster name, cluster uuid, version, tagline 등 정보가 나온다. curl -XGET 'http://localhost:9200' 2. --version 으로 체크 * Version과 build 내용만 나온다. elasticsearch --version
[Elasticsearch] 엘라스틱서치 관련도 score가 결정되는 방법 Elasticsearch 을 공부하다가 마주친 Search Score 가장 적합한 도큐먼트를 찾아야하는 elasticsearch은 어떻게 score를 결정하는 것일까 ? 매 쿼리마다 엘라스틱서치는 관련도 score를 계산한다. 계산할 때 사용하는 알고리즘은 tf-idf 알고리즘이다. tf-idf algorithm : Term Frequency - Inverse Document Frequency tf-idf 알고리즘은 기본적으로 두 가지를 계산한다. 1. tf (term-frequency) : 단어/용어 빈도수 in a document 2. idf (inverse document frequency) : 단어/용어 등장 횟수 in ** ALL ** documents 예를 들어, 아래의 두 문장이 있다고 하자..
[mongoDB] 필드값이 null 또는 not set인 도큐먼트 find문으로 찾기 (feat. $ne: null) mongoDB 에서 Find 쿼리문으로 데이터를 찾을 때 마다 헷갈려서 써보는 공부겸 정리 글 먼저 counter라는 collection에 아래 데이터들을 먼저 넣어 주었다. db.counter.insertOne({name: 'gugucon'}) db.counter.insertOne({name: 'melona', price: 500}) db.counter.insertOne({name: 'byulanba', price: 10000, color: 'brown'}) db.counter.insertOne({name: 'bbabbico', pirce: 1000000, color: null}) db.counter.insertOne({name: 'choco', price: null, color: null}) db.c..
[JaveScript] 이벤트 루프란? 작동 방식 자세히 알아보기 Event loops JavaScript, 싱글 스레드 기반 언어 : 한번에 하나씩 작업 수행, 이벤트 루프를 이용해 비동기 방식으로 동시성 지원한다. 이벤트 루프란 ? : Callback Event Queue에서 하나씩 꺼내서 동작시키는 Loop을 말한다. 위의 그림 전체를 말하는 것 같다. 태스크 큐 ? : web api에서 비동기 작업들이 실행된 후 호출되는 콜백함수들이 기다리는 공간, FIFO, 하나의 큐로 이루어있지 않고 Microtask Queue, Animation Frames 등 여러개의 큐로 이루어져 있다. Web API ? : 브라우저에서 자체 지원하는 api이다. DOM이벤트, AJAX, setTimeout 등의 비동기 작업 등을 수행할 수 있도록 api를 지원한다. 이벤트 루프 프로세스 코드가 호출스택에..
[mongoDB] "errorMessage": "Cannot do exclusion on field dongAddress in inclusion projection" mongoDb find query 문을 날리다가 나온 에러 "errorMessage": "Cannot do exclusion on field dongAddress in inclusion projection" projection 부분에 포함과 제외를 함께 쓸 수 없다는 에러였다. 한 도큐먼트에 newAddress, dongAddress Field 그리고 기타 등등의 필드들이 있다면 * 포함의 경우 const result = await aCertainModel.find({}, 'newAddress dongAddress'); 위의 쿼리문으로 가져올 필드들은 newAddress, dongAddress 가 된다. * 제외의 경우 const result = await aCertainModel.find({}, '-n..
[mongoDB] find 특정 텍스트 스트링 포함된 값 찾기 / 제외하기 mongoDB Find 자세히 알아보기 1. mongoDB의 한 Field 중 특정 텍스트 값을 가진 데이터 찾기 /.* .*/ ex 1) const result = await ACerTainModel.find({ newAddress: /.*광역.*/ }); newAddress 필드에 "광역"이 들어간 모든 데이터가 나온다. 앞 뒤 string 무관 찾을 수 있는 newAddress value : 울산광역시 / 인천광역시 / 광역시 / 광역 / 김광역... 2. 특정 텍스트 값이 없는 데이터 찾기 { filed: { $not: /.*.*/ } } ex 2) const result = await ACerTainModel.find({ newAddress: { $not: /.*서울.*/ } }); newA..
[mongoimport] CSV 파일 createdAt 넣기 'createdAt', could not parse token '2022-05-13 17:05:52' to type date_oracle mongoimport 로 넣은 데이터들이 생각해보니 CraetedAt field가 없었다. 🤦🏽‍♀️ 모델 스키마에 timestamps : true 도 하고 createdAt / updatedAt까지 써주었지만 (원래는 timestamps: true로 충분!!) createdAt이 넣어지지 않아서 생각해보니 webstorm의 내 스키마와 내 터미널의 mongoimport문은 서로 연결(?)고리가 없었다 !! insert하려는 csv 파일에 날짜 형식을 넣어봐도 아래와 같은 에러가 났다. 'createdAt', could not parse token '2022-05-13 08:26:52' to type date_oracle 해결법 : 에러 메세지를 자세히 보면 type date_oracle
[node.js] txt 파일 UTF-8 EUC-KR 인코딩 디코딩 방법 EUC-KR 로 인코딩 되어있는 txt 파일을 node.js로 불러 읽으려니 한글이 깨져 나온다. 인코딩을 위해 순수 자바스크립트로 만들어져 빠르다는 iconv-lite 패키지를 설치해보기 1. iconv-lite 설치 npm install iconv-lite 2. iconv-lite / fs 가져오기 import fs from 'fs'; import iconv from 'iconv-lite'; 3. 사용하기 * iconv-lite 패키지의 특징은 'UTF-8'을 기준으로 한다는 것 ! const file = '/Users/Documents/address_data/match_build_seoul.txt'; // EUC-KR로 된 txt파일 읽은 데이터 content에 담기 const content = f..
[mongoDB] create index $text search 걸어서 특정 단어 검색하기 mongoDB의 한 테이블 안에서 특정 단어 검색할 때 검색할 필드에 inde를 먼저 걸어주어야 한다. 검색하고자하는 필드에 index 생성 db.reviews.createIndex( { comments: "text" } ) Index 여러개 생성 시 db.reviews.createIndex( { subject: "text", comments: "text" } ) => 이렇게 인덱스를 걸어주면 mongodb find 쿼리문에서 $text 를 사용할 수 있다. db.reviews.find({$text: { $search: "내돈내산"} }); 인덱스를 걸은 필드들 중 "내돈내산" 스트링이 있는 document를 찾아준다. Reference : https://www.mongodb.com/docs/manua..
GRS80 UTM-K 좌표계 GPS 표준 좌표 WGS84로 변환하기 공공데이터 api 에서 받은 주소 좌표가 한국 기준의 GRS80 UTM-K로 되어 있었다. 이 좌표값을 GPS 세계 표준 좌표인 WGS84 (EPSG:4326)로 변환하기 구글맵 GPS나 Elasticsearch에는 WGS84를 기준으로 사용한다. 좌표계에 대해 찾아보니 좌표 변환 계산이 생각보다 매 ~ 우 복잡했다. 이미 좌표계 변환에 널리 쓰이는 라이브러리 - proj4가 있어서 이걸 사용해서 변환을 했다. 1. proj4 설치 npm install proj4 2. proj4 가져와서 사용하기 import proj4 from 'proj4'; const exec = async () => { const grs80UtmK = '+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.999..
[mongoimport ] txt cvs파일 mongoDB 대량 insert하기 / type 타입 지정 공공데이터에서 서울 지역의 주소및 정보 txt 파일을 csv로 변환한 후 mongoimport를 사용하여 mongoDB에 밀어 넣기를 해보았다. 처음에는 데이터를 가공해서 넣어야지 했는데 총 60.8만건이어서 매우 막막했다. 먼저 txt -> csv 파일로 변환하기 + 엑셀 표로 만들기 포스팅은 👇 https://blckchainetc.tistory.com/398 txt 파일을 cvs 파일로 바꾸는 방법 / txt, cvs 파일 엑셀 표로 만들기 서울지역의 txt 파일을 mongoDB로 옮기기 위해 txt를 cvs 파일로 바꿨다. 1. txt파일을 Excel로 연다. 2. 다른 이름으로 저장 -> csv utf-8 을 선택한다. 3. 끝~~ 그런데 cvs 파일을 열어보면 표로 되어 있지.. blckcha..
txt 파일을 cvs 파일로 바꾸는 방법 / txt, cvs 파일 엑셀 표로 만들기 서울지역의 txt 파일을 mongoDB로 옮기기 위해 txt를 cvs 파일로 바꿨다. 1. txt파일을 Excel로 연다. 2. 다른 이름으로 저장 -> csv utf-8 을 선택한다. 3. 끝~~ 그런데 cvs 파일을 열어보면 표로 되어 있지 않다. 왜냐하면 다운 받은 txt 파일은 쉼표가 아닌 " | " 기호로 분리되어 있어서 + 표로 되어있지 않아서 그렇다. 이걸 표로 만드려면 아래와 같이 하면 된다. 1. 새로운 엑셀 시트를 열고 -> 데이터 -> 텍스트에서 가져오기 클릭 2. 표로 바꿀 txt 파일을 가져온다. 3. 아래와 같은 옵션으로 설정 후 다음을 클릭 4. "|" 으로 구분기호를 설정하고 다음 클릭 5. "일반" 설정하고 마침 클릭 6. 그러면 데이터가 표로 잘 구분된다. E+11 이렇게..
[Elasticsearch] node.js search 검색 사용법 / parameters / options [ 업데이트 중.... ] 🤿 Elasticsearch + node.js search 정리 및 실습 Query DSL : json 포맷으로 query를 만들어 검색하기 이를 실습하기 전 알아야할 개념 1) Query Context "해당 document가 query 절과 얼마나 잘 일치하는가?" 라는 질문에 응답 => _score(관련성 점수) 로 표현 2) Filter Context "해당 document가 query 절과 일치합니까?" 라는 질문에 응답 => true or flase로 반환, 점수는 계산하지 않음 index: 'test' 안에 있는 모든 도큐먼트를 가져오기 // search 실습 🍕 const searchResult = await client.search({ index: 'test' ..
[JavaScript] 콘솔로그 전체 보기 / console.log more items.. 전체 펼쳐보기 아주 오~랜만에 적는 JS 관련 글! 나는 아직 디버깅할 때 console.log를 많이 사용하는데 가끔 데이터가 아주 길거나 많으면 console.log(numberArray); 이렇게 표시되고 나머지 데이터는 볼 수가 없다. 안의 데이터는 사실 전체를 확인해야하는 일이 별로 없지만 만약 확인해야한다면 console.log 대신 console.dir을 사용하고 첫 번째 인자값 = log 볼 데이터 두 번재 인자값 = 옵션 : maxArrayLength: null 을 넣어주면 console.dir(numberArray, { maxArrayLength: null }); 모든 데이터가 콘솔에 출력된다. 
TypeError [ERR_UNESCAPED_CHARACTERS]: Request path contains unescaped characters 공공 데이터 사이트에서 API를 가져와 사용할 때 나온 TypeError [ERR_UNESCAPED_CHARACTERS]: Request path contains unescaped characters 찾아보니 const requestUrl = 'http://openapi.kric.go.kr/openapi/convenientInfo/stationInfo'; const subwayServiceKey = 'mywkjv32kjshh....'; const stationName ='용산'; const url = `${requestUrl}?serviceKey=${subwayServiceKey}&format=json&stinNm=${stationName}`; console.log('url =', url); 한글을 ur..
[Elasticsearch] Nori 설치 및 실습해보기 Elasticsearch 검색 기능 중 한국어 형태소 분석을 위해 elasticsearch에서 공식적으로 개발한 nori 설치 및 사용해보기 1. nori 설치하기 elasticsearch가 설치된 bin으로 가서 설치한다. elasticsearch-plugin install analysis-nori elasticsearch가 어디에 설치되었는지 확인하고 싶을 때 아래 명령어를 입력하여 확인한다. which elasticsearch 2. elasticsearch 재시작 brew services restart elastic/tap/elasticsearch-full 3. Kibana Dev Tools 에서 _analyze 로 실습해보기 Nori는 nori_tokenizer 토크나이저와 nori_part_of..
[Elasticsearch] scoring _score field 점수매기는 프로세스 🍭 Elasticsearch scoring에 대해 Elasticsearch에서 scoring이란 유저 쿼리에 의해 검색된 documents의 관련성을 결정하는 프로세스이다. scoring이 어떻게 진행되는지 자세히 보기 전, elasticsearch의 검색 과정을 살펴보기 Elasticsearch의 검색 프로세스 1. 먼저 elasticsearch 유저 쿼리에 맞는 모든 도큐먼트들을 찾는다. 이때, 쿼리에 맞으면 1을, 맞지 않으면 0으로 반응하는 Lucene Boolean model을 사용한다. 2. 쿼리와 일치한 도큐먼트들을 Lucene Practical Scoring Function을 사용하여 각 도큐먼트에 점수를 매기고 (score) 그들의 관련성에 따라 분류한다. * Lucene Practica..

반응형