검색기능 튜토리얼


 

개요

  • 알파알렙 성경은 Text-Fabric의 원어 성서 데이터를 기반으로 만들어졌기 때문에 기본적인 검색 방식은 Text-Fabric 쿼리 엔진 방식을 따릅니다. (데이터베이스에 관한 상세한 내용은 다음을 클릭해 주세요: Text-Fabric Wiki)
  • Text-Fabric 데이터베이스는 단어 파싱 정보 뿐만 아니라 구문 정보까지 포함하고 있어서 매우 입체적인 검색을 실행할 수 있습니다.
  • 쿼리입력 방식의 검색 방식은 처음에는 낯설고 까다롭지만 바이블웤스나 어콜던스에서 구현하기 어려운 검색을 보다 간편히 실행할 수 있습니다.
  • 앞으로 더 간단하고 쉬운 방식의 검색 기능도 추가할 예정입니다.

 

1. 데이터 베이스 구조

Text-Fabric의 데이터베이스는 "계층화"가 되어 있습니다.

  • 데이터베이스의 가장 높은 층에는 책(book)이 있고, 그 아래에 문법적인 단위들(절, 구문, 단어)이 종속적으로 연결되어 있습니다.
  • 위와 같은 구조로 데이터베이스가 형성이 되어 있기 때문에 검색 쿼리를 입력할 때에는 위로부터 아래로 차근차근히 범위를 좁혀서 검색을 해 나가면 됩니다.
  • 예를 들면, 창세기의 명사문장들 가운데 주어역할을 하는 אלהים이라는 단어를 찾기 원한다면 아래와 같은 구조로 검색을 하게 됩니다.

책단위(창세기) => 문장절단위 (명사절, 구, 주어) => 단어(אלהים)


 

2. 용어 정의

쿼리 검색을 실행하기 위해서 아래의 용어를 숙지하시면 좋습니다.

  • 쿼리(query): 쿼리는 "질의"라는 의미입니다. 즉, 데이터베이스에 어떤 조건의 데이터를 뽑아서 출력할 것인지를 코드를 통해 질의한다는 의미입니다.
  • 요소(node): 성서 데이터베이스를 이루고 있는 기본 단위 (예. 책단위, 절단위, 구문단위, 단어단위 등)
  • 요소 속성(node feature): 각 요소에 포함되어 있는 속성. (예. 단어단위: "원형", "시제", "품사" 등등)
  • 데이터 슬롯(slots): 각 요소가 위치하고 있는 자리입니다. 각 데이터 요소들은 고유한 자리가 지정되어 있는데 이를 표시한 것입니다.

 

3. 검색 쿼리 작성 방법

기본적으로 검색 쿼리를 작성할 때 아래의 기본 원칙을 숙지해야 합니다.

  • 각 데이터 요소의 계층 구조를 고려하여 작성(예를 들면 단어는 구에 종속. 절은 문장에 종속 등)
  • 종속되는 문법 요소는 들여쓰기 로 표현됩니다.

일단 위에서 든 예를 가지고 실제로 쿼리를 작성해 보겠습니다.

- 창세기와 출애굽기의 명사절들 가운데 אלהים이 주어로 등장하는 경우는?

book book=Genesis|Exodus  
  chapter  
    verse
      sentence  
        clause typ=NmCl  
          phrase function=Subj  
            word lex_utf8=אלהימ

 

  • 위의 쿼리 코드를 살펴보면 가장 상위 요소인 책(book)으로부터 가장 하위 요소인 단어(word)에 이르기까지 모든 요소가 차례대로 입력되어 있는 것을 보실 수 있습니다.
  • 첫 번째 줄의 book book=Genesis|Exodus 는 성서의 책들 가운데 창세기와 출애굽기에서만 찾겠다는 것을 의미합니다. 이 코드에서 book이 두번 반복되어 있는 것을 볼 수 있습니다. 앞의 book은 book이라는 요소를 이용해서 검색한다는 선언입니다. 그리고 각 요소에는 부가적인 속성들이 있습니다. book 요소에는 책을 지칭하는 속성 book 하나뿐입니다. 이와 마찬가지로 chapter, verse 등도 옵션이 하나밖에 없습니다. 아무튼 book 속성을 정의할 때에는 = 기호를 사용하는데 중요한 것은 = 양 옆에 공백이 있으면 오류가 생깁니다.
  • 만약 창세기나 출애굽기에 한정하지 않고 전체 성서의 책들 범위에서 검색하기 원한다면 뒤에 속성을 삭제하거나 book 요소 자체를 삭제하면 됩니다. 단 옵션에 따라 책을 선택하지 않으면 결과값이 나오는 경우가 있으니 검색 결과가 나오지 않는다면 책 범위를 한정해서 시도해 보시는 것이 좋습니다.
  • 복수의 책을 선택할 때에는 책과 책 사이에 | 기호를 삽입하면 됩니다. **여기서도 | 사이에 공백이 있으면 오류가 생깁니다.
  • 성서의 책 이름은 라틴어 표기로 작성해 주어야 합니다. 성서 라틴어 표기는 아래를 참조해 주시면 되고, 검색 쿼리 입력 도우미를 이용하시면 손쉽게 책을 선택할 수 있습니다.
  • book 요소 바로 아래에 하위 요소인 chapter(장) 요소가 있습니다. 특별히 장 번호로 검색 범위를 한정하지 않을 것이기 때문에 별다른 속성을 추가하지 않았습니다(이 경우 chapter 요소 자체를 선언하지 않아도 됩니다. verse, sentence도 마찬가지입니다.) 만약 속성 없이 작성할 경우에는 마지막에 공백을 한칸 주어야 합니다. 즉, chapter를 작성하고 난 다음에 스페이스바를 한번 눌러서 공백을 주어야 합니다. 검색 쿼리 입력 도우미를 이용하면 자동으로 공백이 추가됩니다.
  • 하위 요소를 선언할 때에는 종속 관계를 잘 표시해 주어야 합니다. 이는 들여쓰기 로 표시됩니다. chapter는 book의 하위 요소이기 때문에 들여쓰기를 했습니다. verse는 또한 chapter의 하위 요소이기 때문에 또 한번 들여쓰기를 했습니다. 이런 식으로 상위/하위 요소를 구분해서 작성해 주어야 합니다. 들여쓰기 옵션 또한 검색 쿼리 입력 도우미를 통해 쉽게 추가할 수 있습니다.
  • clause(절)는 sentence의 하위 요소가 되겠습니다. 앞서 명사절이라는 범위를 한정했는데, clause typ=NmCl이라는 표기는 명사절을 선택하겠다는 것을 의미합니다. 이런 각 요소들은 검색 쿼리 입력 도우미를 통해 쉽게 선택할 수 있습니다.
  • phrase(구) 요소 내에는 각 단어구의 기능을 정의할 수 있습니다. 이 경우 "주어"를 선택했습니다.
  • 마지막으로 가장 하위 요소인 word를 선언했습니다. 히브리어 자판을 사용할 수 있는 경우 lex_utf8 옵션으로 찾으면 되고, 그렇지 못한 경우는 lex 옵션을 사용합니다. 히브리어 자판 대신 사용할 수 있는 코드는 아래를 참조해 주시면 됩니다. 단, 히브리어로 검색할 경우 "종결형"(ם, ף, ץ)은 사용하지 않고 일반형(מ, פ, צ)으로 입력해야 합니다.

 

위의 검색 쿼리를 입력하고 "쿼리실행" 버튼을 누르면 아래와 같이 결과값이 출력됩니다.


  • 위의 검색결과에서 쿼리를 통해 입력한 요소들이 표시되어 있음을 볼 수 있습니다(clause, phrase, word 요소가 표시됨). 초록색 칸으로 표시된 부분은 명사절을 의미하는 것이고, 보라색 칸으로 표시된 부분은 주어(구), 그리고 파란색으로 표시된 단어가 검색 쿼리 마지막 줄에 추가한 אלהים입니다.

 

4. 검색 쿼리 입력 도우미

Text-Fabric 데이터베이스는 상당히 방대한 양의 문법 요소와 옵션들을 제공하고 있기 때문에 모든 데이터 요소에 익숙해 지는 것이 쉬운 일이 아닙니다. 따라서 알파알렙 성경앱에서는 보다 쉽게 문법 요소와 옵션들을 입력할 수 있는 인터페이스를 마련하였습니다.

  • 선택자: 선택자 메뉴는 계층으로 구분된 문법요소들과 옵션들을 손쉽게 입력하게 하기 위한 메뉴입니다. 각 메뉴를 선택하면 옵션들을 추가로 입력할 수 있는 옵션이 자동으로 뜹니다. 그런데 이 가운데에는 자동으로 옵션값이 입력되는 메뉴가 있고, 그렇지 않은 경우가 있습니다. 대표적으로 "단어선택"의 옵션인 단어원형(코드/히브리어)과 단어텍스트형(코드/히브리어)의 경우 옵션을 선택한 이후 직접 그 값을 입력해야 합니다. 입력 요령은 위의 예제를 참고하시면 됩니다.
  • 새로운 줄에 추가: 이 메뉴가 클릭 상태가 되면 검색 쿼리 입력 도우미를 통해 입력되는 새로운 코드가 자동으로 마지막 줄에 추가됩니다. 이 메뉴를 해제하면 새로운 줄이 아니라 마지막 줄 오른편에 추가됩니다. 예를 들면 "단어선택" 항목의 다양한 옵션들(원형, 품사, 시제 등등)을 한꺼번에 적용시키기 위해서는 이 메뉴를 해제하고 코드를 입력해야 합니다.
  • 커서위치 다음에 추가: 이 메뉴가 클릭 상태가 되면 검색 쿼리 입력 도우미를 통해 입력되는 코드가 커서 위치 다음에 입력됩니다. 코드 입력시 중간에 코드를 삽입하고 싶거나 수정이 필요한 경우 사용합니다.
  • 들여쓰기 레벨: 위의 예제에서 보듯이 코드는 종속 관계를 유지하면서 작성해야 합니다. 이를 위해 들여쓰기를 해야 하는데 숫자가 올라가면 올라갈수록 들여쓰기가 더 추가됩니다. 들여쓰기 값 1은 스페이스 두번을 치는 것과 같은 효과를 줍니다.

쿼리를 반드시 도우미 기능을 통해 입력해야 하는 것은 아닙니다. 도우미 기능을 통해 입력하다가도 임의로 수정이 가능하고, 처음부터 직접 작성하셔도 상관 없습니다.

 

5. 히브리어 입력

단어를 검색할 때 원형 혹은 텍스트형태를 직접 입력해 주어야 합니다. 히브리어 자판 사용이 가능하지 못한 경우에는 코드를 입력하여 입력이 가능합니다.

  • 원형: 원형은 단어의 사전형태를 의미합니다. 원형을 입력하기 위한 속성은 lex(코드), lex_utf8(히브리어)입니다. 이 조건으로 검색을 했을 경우, 즉 lex_utf8=אלהימ으로 검색할 경우 אלהים 뿐만 아니라 그 변화형들인 אלהינו, אלהיך 등이 모두 검색됩니다.

 

6. 성서 책 이름 라틴어 문자표

한글책명 라틴어책명
창세기 Genesis
출애굽기 Exodus
레위기 Leviticus
민수기 Numeri
신명기 Deuteronomium
여호수아 Josua
사사기 Judices
사무엘상 Samuel_I
사무엘하 Samuel_II
열왕기상 Reges_I
열왕기하 Reges_II
이사야 Jesaia
예레미야 Jeremia
에스겔 Ezechiel
호세아 Hosea
요엘 Joel
아모스 Amos
오바댜 Obadia
요나 Jona
미가 Micha
나훔 Nahum
하박국 Habakuk
스바냐 Zephania
학개 Haggai
스가랴 Sacharia
말라기 Maleachi
시편 Psalmi
욥기 Iob
잠언 Proverbia
룻기 Ruth
아가서 Canticum
전도서 Ecclesiastes
예레미야 애가 Threni
에스더 Esther
다니엘 Daniel
에스라 Esra
느헤미야 Nehemia
역대상 Chronica_I
역대하 Chronica_II

 

7. 연산자 

연산자는 검색에 있어 매우 중요한 기능을 합니다. 연산자를 잘 활용하면 굉장히 폭넓은 검색을 실행할 수 있습니다. 먼저 연산자의 종류와 그 설명을 보겠습니다

연산자 설명
= 두 개체가 동일한 요소를 의미합니다.
# 두 개체가 동일하지 않은 요소를 의미합니다.
< > < 와 > 는 두 다른 개체들 사이의 위치를 의미합니다. 크기가 작은 쪽의 요소가 더 앞에 온다는 것을 의미합니다.
== 두 개체가 같은 슬롯에 위치하고 있음을 의미합니다. 예를 들면 sentence == verse의 의미는 한 절단위의 슬롯과 문장 단위의 슬롯이 동일하다는 의미인데, 결국 그 절은 한 문장으로 되어 있다는 것입니다.
&& 두 개체가 적어도 하나의 슬롯을 공유하고 있다는 의미입니다. 구문 단위가 서로 겹치는 것을 찾는 옵션입니다.
## 두 개체가 동일한 슬롯이 아님을 의미합니다.
[[ ]] 이 연산자는 두 개체의 종속관계를 의합니다. n [[ m은 n이 m을 포함하고 있는 상위 요소임을 의미합니다.
<< >> 이 연산자는 < >와는 달리 슬롯을 기준으로 위치를 정하는 것입니다. clause << phrase의 의미는 clause 요소가 phrase 요소 완전히 밖에 위치하는 경우를 찾는 것입니다.
=: 이는 하위 개체가 상위 개체의 처음에 오는 것을 의미합니다. phrase =: word는 단어가 상위 개체인 구의 처음에 오는 단어를 지정해 주는 것입니다.
:= 이는 하위 개체가 상위 개체의 마지막에 오는 것을 의미합니다.
:: 이는 하위 개체와 상위 개체가 동일함을 의미합니다.
<: n <: m 은 n 개체가 m 바로 앞에 붙어서 나오는 것을 의미합니다.
:> 위와 반대
:k=
=k:
:k:
:k>
k 자리에는 숫자를 입력할 수 있습니다. 숫자는 각 개체 사이의 거리를 의미합니다. k 값이 커지면 커질수록 보다 넓은 범위에서 검색이 가능합니다. 예를 들면 n <3: m은 n과 m이 3슬롯 거리 이하에서 나타나는 경우를 찾아줍니다.
 
  • 이제 연산자를 사용하는 예제를 하나 보도록 하겠습니다. 신명기 전체에서 한 절 내에 יהוה와 אלהים단어가 함께 나오는 경우를 찾아보겠습니다.  

book book=Deuteronomium  
    verse   
        word lex_utf8=יהוה
    = verse  
        word lex_utf8=אלהימ

 

 

  • 위의 예제에서 볼 수 있듯이 두 단어를 각각 다른 verse에 종속시켜 놓았습니다. 만약 verse를 표시해 주지 않는다면 검색 쿼리 결과는 יהוה 혹은 אלהים 단어가 한번이라도 나타나는 절(clause)을 모두 찾아줄 것입니다.
  • 각기 다른 verse 아래에 word를 종속시켜 놓은 다음에 verse 앞에다가 = 를 추가해 주었습니다(연산자를 사용할 때에는 연산자 사이에 스페이스가 있어야 합니다.). 이는 앞의 verse와 뒤의 verse 요소가 동일하다는 의미입니다. 즉 같은 절이라고 하는 의미입니다. 따라서 위 쿼리를 실행하면 한 절에 두 단어가 모두 나타나는 절(clause)을 찾아줍니다.
  • 위 쿼리는 또한 아래와 같이 표시해 줄 수 있습니다.  

book book=Deuteronomium  
    v1:verse   
        word lex_utf8=יהוה
    v2:verse  
        word lex_utf8=אלהימ

v1 = v2

 

  • 각 verse 앞에 별명(변수)을 붙여 주었습니다. 그러고 난 다음에 코드 맨 아래 쪽에 연산자를 이용해서 비교할 수 있게 코드를 작성할 수 있습니다. 간단한 쿼리는 문제 없지만 쿼리가 굉장히 길어질 경우 매우 유용합니다.
  • 위와 같은 변수를 이용해서 검색에 변화를 줘 보겠습니다. 위의 검색 쿼리를 실행하면 יהוה와 אלהים이 위치에 관계없이 한 절(verse)에 등장하는 절(clause)들을 결과로 보여줍니다. 하지만 יהוה אלהינו 구문과 같이 두 단어가 나란히 오는 경우를 검색해 보도록 하겠습니다.  

book book=Deuteronomium  
    v1:verse   
        w1:word lex_utf8=יהוה
  v2:verse  
        w2:word lex_utf8=אלהימ

v1 = v2
w1 <: w2

 

  • 위와 같은 쿼리를 실행하면 יהוה와 אלהים이 나란히 붙어서 나오는 결과만 출력해 줍니다. 단어 요소에다가도 별명을 붙여주어 맨 아래에서 연산자를 이용하여 위치를 한정해 주었기 때문입니다.