'search'에 해당되는 글 42건

  1. 2016.11.15 [미미박스 검색이야기] 연관검색어란?
  2. 2016.11.09 [미미박스 검색이야기] 원하는 상품 찾기
  3. 2016.11.08 [미미박스 검색이야기] 자동완성이란? 2
  4. 2016.11.07 [미미박스 검색이야기] 미미박스는 정확도 우선 검색 기능을 제공 합니다.
  5. 2016.11.07 [미미박스 검색이야기] 시작하며
  6. 2016.05.24 [Elasticsearch] BoolQueryBuilder + TermsQueryBuilder 사용 시 minimum_should_match와 min_should_match
  7. 2016.04.12 [Elasticsearch] This Week in Elasticsearch and Apache Lucene - 2016-04-11
  8. 2016.02.16 [IR] 스탠포드대학 IR-book
  9. 2013.04.15 [elasticsearch] Java API : Search
  10. 2012.12.20 검색 관련 짧은 기법 설명.

[미미박스 검색이야기] 연관검색어란?

ITWeb/미미박스검색이야기 2016. 11. 15. 11:45

오늘은 연관검색어에 대해서 이야기를 해보려 합니다.


연관검색어에 대한 정의는 어떻게 될까요?

우선 정확하게 사전 같은 곳에 등록된 정의는 없는 것 같습니다. 아니면 제가 못찾았나 봅니다.

그래서 제가 생각한 연관검색어의 두 가지 정의에 대해 살펴 보도록 하겠습니다.


1. 입력한 단어와 유사한 검색어

즉, 입력한 검색어를 포함하고 있는 검색어를 추천해서 보여주는 방식이 될 것 같습니다.

이와 비슷한 방식으로 적용된 곳이 네이버 지식쇼핑이 되겠습니다.

http://shopping.naver.com/search/all.nhn?query=%EB%82%98%EC%9D%B4%ED%82%A4&cat_id=&frm=NVSHATC




2. 입력한 단어와 같은 검색어를 입력한 사람들이 입력한 검색어

이 정의는 기본 전제(가정)이 있어야 합니다.

즉, 

- "같은 세션동안 상품을 찾기 위해 입력한 검색어 들이 연관이 있을 것이다" 라는 것과 

- "같은 검색어를 입력한 사용자들은 유사한 관심 또는 상품을 찾고 있을 것이다" 라는

두 가지 전제(가정) 입니다.

이와 같은 방식으로 미미박스의 연관검색어는 기능 구현이 되어 있습니다.

http://search.memebox.com/memebox/search?q=%EB%A9%80%ED%8B%B0%EC%8A%A4%ED%8B%B1&at=1&door=pc_sub&qt=box




1번의 경우 가장 빠르게 구현을 할 수 있습니다.

기본적으로 자동완성 기능을 제공 하고 있다면 자동완성 키워드 목록에서 유사 검색어를 추출 할 수 있습니다.


2번의 경우 검색 로그에 대한 수집과 분석이 함께 이루어져야 합니다.

1번 보다는 시간이 더 많이 걸리며 품질을 높이기 위한 방법을 계속 연구해야 합니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

:

[미미박스 검색이야기] 원하는 상품 찾기

ITWeb/미미박스검색이야기 2016. 11. 9. 09:59

이전 글에서 그냥 정확도 우선이라고 했지 그래서 어떻게 검색을 해야 하는지에 대한 설명이 부족했던 것 같습니다. 그래서 검색창에서 검색 하는 방법에 대해서 이야기를 해보려고 합니다.


이전 글)
[미미박스 검색이야기] 미미박스는 정확도 우선 검색 기능을 제공 합니다.


미미박스에서는 검색 시 입력한 검색어에 대한 Term Query 를 사용합니다.
즉, 입력한 검색어와 정확히 일치하는 단어가 상품 제목이나 설명 등에 포함이 되어 있어야 검색 결과로 제공이 가능 하다는 의미가 됩니다.


대부분의 e-커머스에서는 일반적인 웹문서와 같은 전문(fulltext) 검색을 적용하지 않으며 상품에 대한 특성과 속성에 맞는 검색 기법을 제공해 주게 됩니다.

미미박스 역시 전문 검색을 제공하지 않고 사용자가 입력한 검색어를 하나의 토큰 또는 최소 검색 일치 단어로 활용해서 검색을 수행하고 있으며, 자연어 처리에 대한 또는 서술형 질의에 대한 최적화 작업은 아직 미진합니다.


그럼 몇 가지 예를 들어 검색 활용 방법을 소개해 드리도록 하겠습니다.


Case 1) 특정 브랜드의 어떤 제품을 찾고 싶을 때

본비반트마스크팩을 찾을 경우


브랜드 명 : 본비반트

어떤 제품 : 마스크팩


검색 질의어 및 결과 화면)




Case 2) 어떤 제품을 사용하는데 필요한 도구를 찾고 싶을 때

섀도우브러쉬를  찾을 경우


어떤 제품 : 섀도우

도구 : 브러쉬


검색 질의어 및 결과 화면)



Case 3) 어떤 기능성을 가진 어떤 제품을 찾고 싶을 때

보습 기능을 가진 오일 제품을 찾을 경우


어떤 기능성 : 보습

어떤 제품 : 오일


검색 질의어 및 결과 화면)



이와 같이 3가지 예를 들어 설명을 드렸습니다.

원하시는 상품을 찾는데 도움이 되셨으면 좋겠습니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.


:

[미미박스 검색이야기] 자동완성이란?

ITWeb/미미박스검색이야기 2016. 11. 8. 18:06

자동완성이란?

네이버 지식백과에서는 아래와 같이 나옵니다.

https://search.naver.com/search.naver?where=kdic&query=%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1&ie=utf8&sm=tab_nmr


그냥 제가 정의 하는 자동완성은 검색어에 대한 recommendation 이나 suggestion 기능이라고 생각 합니다.

미미박스에서 구현하고 있는 자동완성 기능은 아래와 같습니다.


기본은 검색결과가 있는 검색어를 대상으로 로그를 수집하며, 최근 일주일 데이터를 기반으로 Near Real Time 반영을 하고 있습니다.

이유는 좀 전까지 존재하던 검색어의 검색결과가 없어지게 되는 경우가 있습니다. 이를 반영해 주기 위해 NRT 색인을 하고 있습니다.


1. 초성 입력에 대한 검색어 제안이 가능 합니다.

검색어 입력) ㅁㅁㅂㅅ



2. 자소분리 입력에 대한 검색어 제안이 가능 합니다.

검색어 입력) 미밉 -> ㅁㅣㅁㅣㅂ


자소 단위 검색은 입력한 자음과 모음을 분리해서 검색이 가능 하도록 해주는 기능 입니다.


3. 한영 변환에 대한 검색어 제안이 가능 합니다.

검색어 입력) alalqkrtm


※ 한영 변환의 경우 영타로만 입력이 가능 할 경우 유용하게 사용할 수 있는 기능이며 자동으로 지원 됩니다.


4. 자동완성 검색어에 대한 검색 베스트 딜 제안이 가능 합니다.

검색어 입력) 미미박스 브러쉬 (선택)


5. 자동완선 검색어에 대한 매칭 검색어에 강조 표기가 가능 합니다.

검색어 입력) 아임미미


6. 바로보기 라는 카테고리와 브랜드 필터 추천이 가능 합니다.

검색어 입력) 틴트


※ 바로보기 란? 우선 급하게 작명을 하다 보니 너무 뻔한 "추천필터", "추천카테고리", "추천브랜드" 등등으로 넣기가 싫었습니다. 하지만 개발자의 작명 실력으로 인해 이름과 기능에 대한 오해를 만들게 되었는데요. 이 기능은 검색어를 기반으로 한 추천 카테고리와 추천 브랜드를 보여주는 검색 필터링 기능 이며, 검색 결과 화면에서 제공되는 카테고리, 브랜드 필터 기능이 되겠습니다.


※ 저 추천 카테고리와 브랜드는 검색어가 완성형으로 입력이 되었을 때만 노출이 되게 됩니다. 이유는 사용자가 입력한 검색어를 조작하지 않기 위함이며 정확한 의도를 반영해 주기 위해서 이와 같이 구현하였습니다. 이 필터와 함께 사용하시면 원하시는 상품에 대한 대상을 좁혀서 검색을 하실 수 있게 됩니다.



좀 더 사용하기 편한 기능과 도움이 되는 정보를 제공드릴 수 있도록 노력 하겠습니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

:

[미미박스 검색이야기] 미미박스는 정확도 우선 검색 기능을 제공 합니다.

ITWeb/미미박스검색이야기 2016. 11. 7. 12:19

[간단 요약]

미미박스 검색서비스에서는)

1. 정확도 우선의 검색 기능을 제공 하고 있습니다.

2. 정확도 우선의 검색 기능을 활용하기 위해서는 검색어에 대한 띄어쓰기중요합니다.

3. 검색 태그 관리가 중요 합니다. (아직 검색 태그에 대한 개선 작업을 못하고 있습니다.)


참고자료)

Precision 과 Recall


제가 미미박스에 합류하게 된 이유는

1. 검색 서비스에 대한 개발을 제가 주도적으로 할 수 있을 것 같아서와 

2. 해야할 게 많을 것 같다 라는

것 때문 이었습니다.


예전 미미박스 검색은 형태소 분석기에 의존적인 검색 기능을 제공하고 있었습니다.

이 방법이 틀렸다 나쁘다는 것은 절대 아닙니다.

단, 형태소 분석기 의존적으로 검색 기능을 제공하기 위해서는 사전 관리가 매우 중요합니다.


여기서 사전관리는 포괄적인 사전 관리를 의미 하며, 단순 유의어/동의어 관리 수준을 의미 하는 것이 아닙니다.


미미박스에서는 검색 서비스는 아래와 같이 분리가 되어 진행 되고 있었습니다.

1. Native App

2. PC Web

3. Mobile Web


각 서비스 마다 제공되는 검색 기능이 달랐으며, 가장 중요하게 생각했던 서비스는 App 이였기 때문에 PC Web, Mobile Web에 대한 검색 기능 개선은 관심 밖이였던 것 같습니다.


보통 e-커머스 서비스에 들어오는 고객들은 크게 두 분류로 나뉘다고 생각 합니다.

1. 불특정 목적으로 방문하는 고객

2. 특정 목적으로 방문하는 고객


이 두 고객의 행동 특성은 검색 관점에서 아래와 같이 분류 된다고 생각 합니다.

1. 단순 브라우징 검색을 하는 고객

2. 목적성을 갖는 검색어를 통한 검색을 활용하는 고객


어쨌든 미미박스에서 검색서비스 기능은 통합 검색창 이외 어떤 기능도 제공이 되고 있지 않았습니다. (PC Web, Mobile Web)

단, native app은 일부 정렬과 검색 필터 기능을 포함하고 있었습니다.

그래서 미미박스 검색서비스를 완전 바닥 부터 새로 만들기로 하였습니다.


제가 처음 검색 개편을 이야기 하면서 e-커머스 에서 검색 서비스는 기본적으로 정확도(precision)가 중요하다고 이야기를 하였고 미미박스도 정확도 우선의 검색 서비스를 제공해 줘야 한다고 했습니다.


제가 제시한 정확도는 사용자가 입력한 검색어와 정확히 일치하는 문서에 대해서 검색이 되어야 한다는 것이었습니다.

이와 같이 변경이 될 경우 띄어쓰기는 매우 중요해 집니다.


예) 정확도 우선 시 검색어 적용 예시


1번은 "포니" + "립스틱" 라는 두 개의 검색어가 포함된 문서를 검색해 주며, 반드시 두 개의 검색어를 문서가 포함하고 있어야 합니다.

- 1번의 의도는 포니라는 제품과 립스틱 이라는 제품에 대한 AND 또는 OR 검색을 원한다고 생각 할 수 있습니다.


2번은 "포니립스틱" 라는 하나의 검색어가 포함된 문서를 검색해 줍니다.

- 2번의 의도는 포니립스틱이라는 단일 제품을 원한다고 생각 할 수 있습니다.


하지만 기존 사용자들은 정확도 우선으로 검색 경험을 가지고 있지 않았기 때문에 띄어쓰기에 대한 개념이나 활용에 대해서 인지를 못하고 있습니다. 여전히 띄어쓰기를 활용한 검색 패턴이 늘어나지 않고 있는 이유 이기도 한 것 같습니다.


결과적으로 검색을 하는 사용자들은 자신이 찾고자 하는 상품을 잘 찾을 수 있어야 하고 그 대상이 너무 많이 노출 되게 되면 상대적으로 상품을 클릭하기 보다 이탈을 하게 되는 경우가 많이 발생하게 됩니다.

이렇기 때문에 검색에서는 narrow down search 기능을 제공을 해줘야 하고 그에 맞는 검색 필터링 기능이 제공되어야 합니다.


좀 두서 없이 쓰다 보니 내용의 본질이 뭔지 전달이 잘 안되는 것 같내요.


정리 하겠습니다.

미미박스 검색서비스에서는)

1. 정확도 우선의 검색 기능을 제공 하고 있습니다.

2. 정확도 우선의 검색 기능을 활용하기 위해서는 검색어에 대한 띄어쓰기가 중요합니다.

3. 검색 태그 관리가 중요 합니다. (아직 검색 태그에 대한 개선 작업을 못하고 있습니다.)


앞으로 고객 요구에 맞는 검색 기능을 제공 할 수 있도록 노력 하겠습니다.


※ 본 글은 회사의 입장과는 전혀 상관이 없으며 개인적인 의견으로 작성된 글 임을 알려 드립니다.

:

[미미박스 검색이야기] 시작하며

ITWeb/미미박스검색이야기 2016. 11. 7. 11:36

오늘 부터 미미박스에서 검색 서비스에 대한 이야기를 블로그에 정리해 볼까 합니다.

개인적으로 회사에 소속되어 있으면서 서비스를 하고 싶은 방향에 맞춰서 빠르게 개발하고 적용 할 수 있다는게 얼마나 좋은지 모릅니다.


하지만 저희 팀에서 개발하고 배포하고 하면서 고객들에게 기능에 대한 설명이라던가 사용법에 대해서는 한번도 설명을 해주거나 도움을 주기 위한 채널을 만들지 못하는 것 같아 그냥 서비스에 대한 기능 위주로 어떻게 만들어졌고 어떻게 동작하는지 정리를 하고자 합니다.


생각 보다 잦은 기능 변경도 많고 눈에 띄는 것 그렇지 않은 것 등등 매주 많은 변화가 있지만 사실 사용하는 사람들에게는 뭐가 어떻게 바뀌었고 어떻게 사용해야 좋은지 전혀 전달해 주지 못했습니다.


이제 부터 하나씩 하나씩 미미박스 검색 서비스에 대한 이야기를 풀어 보도록 하겠습니다.

:

[Elasticsearch] BoolQueryBuilder + TermsQueryBuilder 사용 시 minimum_should_match와 min_should_match

Elastic/Elasticsearch 2016. 5. 24. 18:11

이게 또 언제 변수명이 바뀌었을까요?

버전 릴리즈 될때마다 소스코드를 다 따라 갈수가 없다 보니 이런 오류를 경험하게 되내요.


주의) min_should_match 는 java api 를 이용해서는 사용 할 수 없습니다.


[Terms Query]

이 쿼리는 field 에 여러개의 term 을 넣어서 질의 할 수 있도록 해줍니다.

그래서 기본 or 검색을 지원하고 있구요. 여기서 and 연산을 하고 싶으면 terms query 에 아래 변수 값을 지정 하셔야 합니다.


min_should_match:TERM_SIZE


OR)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "terms": {

           "title": [

              "포니",

              "이펙트"

           ],

           "min_should_match": 1

        }                

    }

}'



AND)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "terms": {

           "title": [

              "포니",

              "이펙트"

           ],

           "min_should_match": 2

        }                

    }

}'


[Bool Query + Terms Query]

이 쿼리는 compound query 작성을 위해 많이 사용하는 것입니다.

bool query 안에 terms query 를 섞어 사용하는 것이구요. 좀 더 and, or 연산을 다양하게 할 수 있게 해줍니다.

여기서는 miminum_should_match 를 통해서 and, or 연산을 해야 하는데 terms query 에서의 min_should_match 를 사용하지 않게 되면 정상적인 결과를 얻을 수 없게 됩니다. (아무래도 2.3.3 에서 5.0 으로 넘어가는 과도기라 그런게 아닌가 싶습니다.)

should 를 여러개 사용할 경우 miminum_should_match 설정을 하셔야 합니다.


OR)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "bool" : {

            "should": [

               {

                   "terms": {

                      "title": [

                         "포니",

                         "이펙트"

                      ],

                      "min_should_match": "1"

                   }

               }

            ]

        }

    }

}'


AND)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "bool" : {

            "should": [

               {

                   "terms": {

                      "title": [

                         "포니",

                         "이펙트"

                      ],

                      "min_should_match": "2"

                   }

               }

            ]

        }

    }

}'


:

[Elasticsearch] This Week in Elasticsearch and Apache Lucene - 2016-04-11

Elastic/Elasticsearch 2016. 4. 12. 09:59

봐야지 봐야지 하다 이제 봅니다.

제 눈에 띄는 것은 


  • Now that we have removed the percolator API, we should also remove the percolator type and use percolator fieldsinstead.

예전에 분리 되어 있던걸 합치더니 다시 분리 하는 것 같습니다.

task cancelled 기능을 테스트 해봐야 할 것 같습니다.

이제 field name 작성시 주의해야 겠내요. 좀 더 strict 해졌다고 봐야겠죠. ^^
- 아래 코드가 true에서 false로 되었습니다. (이 기능이 성능이나 기타 다른 기능적인 오류를 만들어 내는 걸까요?)
jsonFactory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

percolator 기능이 fields 로 빠졌내요. 이것도 기능 확인을 해봐야 겠내요.
등록된 issue 를 보면 ㅎㅎ 직관적이고 사용이 좀 더 편해진것 같습니다.

core 2.x에 반영된 내용은 거의 v5.0.0 에 적용 될것 같습니다.

루씬은 일단 6.0.0 이 릴리즈 vote 중이였고 이미 4월 8일에 릴리즈 되었습니다. 이외 다른 내용들은 거의 geo point, locaiton 관련 내용들 입니다.

루씬 6.0.0 릴리즈 소식으로는
  • Java 8 is the minimum Java version required.

  • Dimensional points, replacing legacy numeric fields, provides fast and space-efficient support for both single- and multi-dimension range and shape filtering. This includes numeric (int, float, long, double), InetAddress, BigInteger and binary range filtering, as well as geo-spatial shape search over indexed 2D LatLonPoints. See this blog post for details. Dependent classes and modules (e.g., MemoryIndex, Spatial Strategies, Join module) have been refactored to use new point types.

  • Lucene classification module now works on Lucene Documents using a KNearestNeighborClassifier or SimpleNaiveBayesClassifier.

  • The spatial module no longer depends on third-party libraries. Previous spatial classes have been moved to a new spatial-extras module.

  • Spatial4j has been updated to a new 0.6 version hosted by locationtech.

  • TermsQuery performance boost by a more aggressive default query caching policy.

  • IndexSearcher's default Similarity is now changed to BM25Similarity.

  • Easier method of defining custom CharTokenizer instances.



원본링크)

Elasticsearch Core

Changes in 2.x:

Changes in master:

Ongoing changes:

Apache Lucene



:

[IR] 스탠포드대학 IR-book

ITWeb/검색일반 2016. 2. 16. 09:50

스탠포드 대학에서 제공하고 있는 IR-book 입니다.

참고하기 위해 스크랩 합니다.


원문링크)


원문목차)

Introduction to Information Retrieval: Table of Contents

 chapter     resources
Front matter (incl. table of notations)pdf
01  Boolean retrievalpdf html
02The term vocabulary & postings listspdf html
03Dictionaries and tolerant retrievalpdf html
04Index constructionpdf html
05Index compressionpdf html
06Scoring, term weighting & the vector space modelpdf html
07Computing scores in a complete search systempdf html
08Evaluation in information retrievalpdf html
09Relevance feedback & query expansionpdf html
10XML retrievalpdf html
11Probabilistic information retrievalpdf html
12Language models for information retrievalpdf html
13Text classification & Naive Bayespdf html
14Vector space classificationpdf html
15Support vector machines & machine learning on documentspdf html
16Flat clusteringpdf htmlhtml
17Hierarchical clusteringpdf html
18Matrix decompositions & latent semantic indexingpdf html
19Web search basicspdf html
20Web crawling and indexespdf html
21Link analysispdf html
Bibliography & Indexpdf
bibtex filebib


각 챕터별 요약 원문)


Chap01. Information retrieval! using the Boolean model

-         상용 검색서비스의 대부분이 채택하고 있는 모델인 불리언 검색 모델에 대한 내용

-         AND, OR 등의 연산자를 포스팅 리스트를 통해서 어떻게 처리하고 있는지를 설명

è 현재 우리가 사용하고 있는 검색엔진의 작동 방식을 설명여러 관련 컴포넌트는 어떤것들이 있는지 등등


Chap02. The dictionary and postings lists

-         빠른 검색을 위해 색인 처리를 하는데이를 구성하는 사전과 포스팅 리스트에 대한 내용

-         우리가 사용하고 있는 사전과 포스팅 외에도 다양한 용도의 다른 사전과 텀 포지션 정보들에 대해 설명

è 빠른 검색을 위해 문서의 정보를 검색엔진에 적합하도록 가공하는데 그것에 대한 결과물이죠.


Chap03. Tolerant retrieval! 

-         실데이터를 다룰 때 발생하는질의어 상에 또는 문서나 사전 상에여러 오류를 처리하는 내용

-         부분패턴 검색, k-Gram 처리오타처리동음어 처리 등에 대해 설명

è 검색 서비스를 위해서 꼭 필요한 유틸리티라 할 수 있는데 편의성과 융통성 등을 높여줍니다.


Chap04. Index construction

-         제한된 머신의 리소스 안에서 대용량의 색인을 처리하는 방법에 대한 내용

-         블록병합색인분산색인동적색인포지션 정보를 포함한 색인권한 정보를 포함한 색인

è 서비스 파트에서 열심히 하고 있는 작업이죠대용량의 색인을 할 때 필요한 지식입니다.


Chap05. Index compression

-         색인 데이터를 실제 메모리에 올려 사용해야 하기 때문에 성능을 고려한 압축이 필요그에 대한 내용

-         색인용량 예측방법(사전,포스팅), Dictionary압축블록저장, PostingFile압축γ코드 압축, Zipf의법칙

è 데이터 특성에 따라 더 효율적인 압축도 가능합니다더 빠르게더 작게.. 맨날 하는 색인작업이 1시간 안에 끝난다면 좋겠죠.


Chap06. Term weighting and vector space models

-         단어 가중치 기법을 이용하여 질의어와 문서의 유사성 거리를 벡터 방식으로 풀어내는 검색 모델 소개

-         단어와 문서 구역에 대한 Scoring 및 Weighting, TF, IDF, TF*IDF, 가중치 정규화유사도 함수

è 불리언의 필터링 성격보다 보다 진보한 형태의 검색기법입니다질의와 문서의 유사도에 대한 개념이 시작됩니다.


Chap07. Computing scores in a complete search system

-         단어 가중치 기법 이외의 스코어링과 랭킹 기법에 대한 설명

-         스코어링과 랭킹챔피온 리스트품질 스코어링, Ordering, 스코어링용 Features, 스코어링 디자인

è 랭킹에 대한 가중치는 우리도 많이 사용하고 있죠더 좋은 검색 품질을 위해 끊임없이 개발해야 하는 부분입니다.


Chap08. Eval!uation in information retrieval!

-         검색 모델의 검색 성능 측정 방법에 대한 내용

-         테스트 콜렉션정확도와 재현율랭킹에 대한 평가적합도 판정시스템 품질과 사용성

è 검색 서비스의 오픈할 때 하는 성능측정 외에도 계속적인 평가와 모니터링이 필요합니다쿼리 파라미터의 뭘 수정해야 할까요??


Chap09. Relevance feedback and query expansion

-         사용자 피드백에 의한 재검색 모델과 질의어 확장에 대한 내용

-         최적화된 결과를 내놓기 위한 방법, Rocchio 알고리즘확률적 적합도질의 확장용 사전자동 시소러스 생성

è 쇼핑관련 검색서비스 등에 적용하면 좋은 모델입니다쿼리확장은 공통이지만 모호성이 있는 특히 지식뉴스일반 웹검색 등에 더욱 필요하죠.


Chap10. XML retrieval!

-         일반 텍스트가 아닌 구조적 텍스트인 XML 문서에 대한 검색 방법에 대한 내용

-         XML 문서, XML 검색 개요, XML 검색용 벡터 모델콘텐츠 중심과 구조적 중심의 검색 비교

è 그다지 새로운 개념은 아닙니다전처리파트에서 HTML, PDF, DOC, PPT 파일등을 XML로 가공해서 퍼주면 해야할 일들입니다.


Chap11. Probabilistic information retrieval!

-         확률적 검색 모델에 대한 내용

-         확률이론확률적 랭킹기법이진독립모델확률값(기대치추정다양한 확률 모델

è 불리언 검색의 대안 모델중에 하나인 확률모델입니다. 0/1 대신에 질의어에 대한 문서 적합성을 확률로 계산하죠.


Chap12. Language models for information retrieval!

-         언어적 특징(특정 단어가 실제로 쓰여질 확률)에 기반한 검색 모델 소개

-         Query likelihood model, Ponte & Croft 실험다양한 언어모델 기법

è 많이 쓰이는 단어 많이 쓰이지 않는 단어에 각기 다른 가중치를 두어 질의어를 가공하면 좀 더 주제가 명확한 결과가 나오겠죠.


Chap13. Text classification and Naive Bayes

-        문서 분류와 나이브 베이지안(확률적분류 기법에 대한 내용

-         문서 분류, Naïve Bayes 분류기법, Bernoulli 모델특징 추출상호 정보성(Mutual Information), 카이스퀘어 특징추출분류 평가

è 검색은 대규모의 컬렉션에서 사용자의 의도에 적합한 문서를 필터링하는 작업을 말하는데 이를 분류라고 표현할 수도 있습니다.
 
유사성 혹은 관련성에 의한 분류 기법으로 검색품질을 높일수 있습니다서치 플러그인 등에서 사용하면 좋겠죠.


Chap14. Vector space classification

-         벡터 공간 모델에 의한 분류 기법에 대한 내용

-         Rocchio 분류, k-nearest neighbor(k근접이웃), 선형 및 비선형 분류분류의 tradeoff

è 유사하다는 개념을 어떻게 정의하면 좋을까요뚝딱 반으로 자를까요고려할 요소가 많아 복잡한건 어떻게 자를까요?

 

 

Chap15. Support vector machines and kernel functions

-         14장의 벡터공간모델에 의한 기계학습기법인 SVM에 대한 내용분류 기법에 대한 핵심 함수

-         SVM, 유연한 경계에 의한 분류비선형 SVMs

è 분류를 위한 대표적인 기계학습기법인 SVM입니다수학을 잘하면 재밋는데 못하면 재미없습니다
   
결과가 주어졌을 때 x,y,z 등에 의한 선형분석입니다오류를 최소로 만드는 해를 찾는 기법이죠분류는 다 이런 식입니다.


Chap16. Flat clustering

-         비교사학습인 군집화 기법에 대한 내용 (vs 분류는 정답이 있는 교사학습기법), 평면적인 군집

-         정보검색에서의 군집화군집평가, k평균 알고리즘, EM 클러스터링

è 분류는 검색형태에 대한 의도를 품고서 문서를 솎아내는 방식이라 지속적으로 관리가 필요합니다구체적인 기획이 필요하죠.
   
반면에 군집은 유사성이라는 척도 하나로 알아서 다해줍니다후처리에서 미리 해주면 검색품질이 엄청 좋아집니다.
   
또는 검색엔진을 거친 후 재가공으로서 사후클러스터링을 하면 같은 질의어에 다른 내용의 문서들을 어느정도 모아서 볼여줄 수 있겠죠.


Chap17. Hierarchical clustering

-         구조적인(상향식하향식군집기법에 대한 내용

-         싱글링크&완전링크 군집화그룹핑 방식의 군집화중심축 기반의 군집화군집명명기법

è 앞에 군집기법은 좀 옛날겁니다요즈음은 인간의 군집화 방식을 좀 더 흉내내어 다 부순다음에 하나씩 모아가는 방식이거나
   
또는 하나로 뭉쳐놓은 상태에서 아닌것들을 짤라내는 형식으로 군집화를 합니다제 논문도 이에 관련한거죠재밋습니다.


Chap18. Matrix decompositions and Latent Semantic Indexing

-         행렬분해와 잠재의미인덱싱 기법에 대한 내용 (요인분석과 차원축소를 이용한 인덱싱)

-         선형대수학행렬분해단어-문서 행렬고유값분해저차원 추정과 잠재의미색인(LSI)

è 행렬이 나오는데 아주 골치아프더군요내용인즉슨 단어로 쪼개진 사전 기반의 색인방식을 해결하기 위한 대안으로 단어와 문서의 관계를 통째로 색인하자는거죠통째로 색인하면 콜렉션과 단어의 관계성이 그대로 살아있게됩니다그걸 그냥 쓰려니 너무 커서 줄여서 쓰는 방법을 고안한거죠.


Chap19. Web search basics

-         웹검색에 관련한 다양한 이슈들에 대한 내용

-         웹의 특징웹 그래프스팸웹광고웹검색 경향, fingerprint, 중복문서 해결기술과 Shingling

è 중복문서 제거입니다수집 문서중에서 많게는 70~80%가 중복이라는군요.
   
이를 해결하기 위해 핑거프리트와 Shingling에 대해 소개하고 있습니다구글에 적용된 방식이기도 하구요스팸처리도 있군요.


Chap20. Web crawling and indexes

-         웹문서 수집과 색인에 대한 내용

-         Crawling, 크롤러 구조, DNS 처리방안, URL 프론티어분산색인병렬서버

è 누가 더 많이 수집하고 누가 더 빨리 처리해서 색인기에 집어 넣느냐는 절대적인 성능지표이죠.
   
또 우리나라 검색회사가 글로벌로 성장해서 아시아의 모든 문서를 하나의 검색서비스로 제공한다면 어떻게 해야 할까요구글은 하고 있습니다.

Chap21. Link analysis

-         그래프 구조의 형태를 갖는 웹문서의 특징을 이용한 분석기법에 대한 내용 (구글의 Pagerank)

-         Pagerank, 마코브 체인페이지랭크 계산특정 토픽기반의 Pagerank, Hubs(참조) and Authorities(권위)

è 21세기 히트작이죠구글의 페이지랭크입니다이를 기회로 사회적 네트워크에 대한 관심이 폭발적으로 높아졌습니다.
   
싸이월드도 그 대표적인 사례죠카페가 강점인 우리회사도 이를 충분히 이용할 수 있습니다블로그는 더더욱 그렇구요펌질~
   
우리나라 사람들은 입소문을 잘 내기도 하고 군중심리도 있기 때문에 그래프 분석을 하면 검색에 큰 효과를 가져올 수 있을겁니다제가 궁극적으로 하고 싶은 분야도 이쪽입니다게시판의 글들을 컨셉별로 나눌수도 있고 관련 UCC를 연결할 수도 있겠죠~되면^^

:

[elasticsearch] Java API : Search

Elastic/Elasticsearch 2013. 4. 15. 11:36

본 문서는 개인적인 테스트와 elasticsearch.org 그리고 community 등을 참고해서 작성된 것이며,

정보 교환이 목적입니다.


잘못된 부분에 대해서는 지적 부탁 드립니다.

(예시 코드는 성능 및 보안 검증이 되지 않았습니다.)



[elasticsearch java api 리뷰]

원문 링크 : http://www.elasticsearch.org/guide/reference/java-api/search/


- 이 API는 검색 쿼리를 실행 할 수 있으며, 쿼리와 일치하는 결과를 구할 수 있습니다.


원문 예제 부터 살펴 보겠습니다.

SearchResponse response = client.prepareSearch("index1", "index2")

        .setTypes("type1", "type2")

        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

        .setQuery(QueryBuilders.termQuery("multi", "test"))             // Query

        .setFilter(FilterBuilders.rangeFilter("age").from(12).to(18))   // Filter

        .setFrom(0).setSize(60).setExplain(true)

        .execute()

        .actionGet();

- 두 개의 색인 파일에 대한 검색 조건을 생성 합니다. (index1 과 index2)

- 역시 각 index 에 대한 type을 지정 합니다.

- REST 방식으로 표현하게 되면 http://localhost:9200/index1,inde2/type1,type2/_search?....... 과 같이 됩니다.

  - http://www.elasticsearch.org/guide/reference/api/search/indices-types/

- termQuery 에서 multi 라는 field 에 test 라는 term 을 찾게 됩니다.

    /**

     * A Query that matches documents containing a term.

     *

     * @param name  The name of the field

     * @param value The value of the term

     */

    public static TermQueryBuilder termQuery(String name, String value) {

        return new TermQueryBuilder(name, value);

    }


[Operation Threading Model]

- NO_THREADS : 호출된 쓰레드에서 실행

- SINGLE_THREAD : 또 다른 하나의 쓰레드를 생성하여 모든 shard 를 조회

- THREAD_PER_SHARD : 각 개별 shard 별로 쓰레드를 생성하여 실행

- Default SINGLE_THREAD 로 설정이 되어 있고, 성능적인 확인은 필요함.


[MultiSearch API]

SearchRequestBuilder srb1 = node.client()

    .prepareSearch().setQuery(QueryBuilders.queryString("elasticsearch")).setSize(1);

SearchRequestBuilder srb2 = node.client()

    .prepareSearch().setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);


MultiSearchResponse sr = node.client().prepareMultiSearch()

        .add(srb1)

        .add(srb2)

        .execute().actionGet();


// You will get all individual responses from MultiSearchResponse#responses()

long nbHits = 0;

for (MultiSearchResponse.Item item : sr.responses()) {

    SearchResponse response = item.response();

    nbHits += response.hits().totalHits();

}

- 개별 검색 조건에 대한 한번의 요청으로 각각의 검색 결과를 얻을 수 있습니다.


[Using Facets]

http://www.elasticsearch.org/guide/reference/java-api/facets/

SearchResponse sr = node.client().prepareSearch()

    .setQuery(QueryBuilders.matchAllQuery())

    .addFacet(FacetBuilders.termsFacet("f1").field("field"))

    .addFacet(FacetBuilders.dateHistogramFacet("f2").field("birth").interval("year"))

    .execute().actionGet();


// Get your facet results

TermsFacet f1 = (TermsFacet) sr.facets().facetsAsMap().get("f1");

DateHistogramFacet f2 = (DateHistogramFacet) sr.facets().facetsAsMap().get("f2");

- facet 검색은 검색 결과에 대한 분류 또는 그룹핑으로 이해 하시면 접근 하시는데 조금 쉽습니다.

- termsFacet("f1") 에서 f1 은 facet name 입니다.


아래 부터는 테스트로 작성한 코드 입니다.

참고용으로만 사용하시기 바랍니다.


[기본 Query Search]

response = client.prepareSearch("facebook")

.setOperationThreading(SearchOperationThreading.THREAD_PER_SHARD)

.setRouting("1365503894967")

.setTypes("post")

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(QueryBuilders.termQuery("title", "9"))

.setFrom(0)

.setSize(20)

.setExplain(true)

.execute()

.actionGet();

log.debug("{}", response);


[Multi Search]

SearchRequestBuilder srb1 = client

    .prepareSearch("facebook").setQuery(QueryBuilders.queryString("93").field("title")).setSize(1);

SearchRequestBuilder srb2 = client

.prepareSearch("facebook").setQuery(QueryBuilders.matchQuery("title", "94")).setSize(1);


MultiSearchResponse sr = client.prepareMultiSearch()

        .add(srb1)

        .add(srb2)

        .execute().actionGet();


// You will get all individual responses from MultiSearchResponse#responses()

long nbHits = 0;

for (MultiSearchResponse.Item item : sr.responses()) {

    response = item.response();

    log.debug("{}", response);

}


[MatchQeury]

response = client.prepareSearch("facebook")

.setOperationThreading(SearchOperationThreading.THREAD_PER_SHARD)

.setTypes("post")

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(

QueryBuilders.matchQuery("title", "1365577624100 twitter")

.type(Type.BOOLEAN) // default, PHASE 와 PHARE_PREFIX 는 하나의 TERM 으로 매칭.

.analyzer("gruter_analyzer") // analyzer는 지정 하지 않으면 settings 값으로 동작 함.

.operator(Operator.OR) // query 에 대한 token 연산을 의미 함.

)

.setFrom(0)

.setSize(5)

.setExplain(false)

.execute()

.actionGet();

log.debug("{}", response);


[Multi MatchQuery]

response = client.prepareSearch("facebook")

.setOperationThreading(SearchOperationThreading.THREAD_PER_SHARD)

.setTypes("post")

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(

QueryBuilders.multiMatchQuery("136557762410", "docid", "title") // 각 field 에 대해서 matchQuery 를 수행 하는 것과 같은 효과.

.type(Type.PHRASE_PREFIX)

.operator(Operator.OR)

)

.setFrom(0)

.setSize(14)

.setExplain(false)

.execute()

.actionGet();

log.debug("{}", response);


[Facet Search]

response = client.prepareSearch("blog")

.setQuery(QueryBuilders.matchAllQuery())

.addFacet(FacetBuilders.termsFacet("facetYear").field("year"))

.addFacet(FacetBuilders.termsFacet("facetMonth").field("month"))

.addFacet(FacetBuilders.termsFacet("facetDay").field("day"))

.execute()

.actionGet();

TermsFacet facetYear = (TermsFacet) response.facets().facetsAsMap().get("facetYear");

TermsFacet facetMonth = (TermsFacet) response.facets().facetsAsMap().get("facetMonth");

TermsFacet facetDay = (TermsFacet) response.facets().facetsAsMap().get("facetDay");

log.debug("{}", response);

- facet search 테스트를 위한 scheme 정보는 아래와 같습니다.

    "mappings" : {

        "post" : {

            "properties" : {

                "docid" : { "type" : "string", "store" : "yes", "index" : "not_analyzed", "include_in_all" : false },

                "title" : { "type" : "string", "store" : "yes", "index" : "analyzed", "term_vector" : "yes", "analyzer" : "gruter_analyzer", "include_in_all" : false },

                "year" : { "type" : "integer", "store" : "no", "index" : "not_analyzed", "include_in_all" : false },

                "month" : { "type" : "integer", "store" : "no", "index" : "not_analyzed", "include_in_all" : false },

                "day" : { "type" : "integer", "store" : "no", "index" : "not_analyzed", "include_in_all" : false }

            }

        }

    }



:

검색 관련 짧은 기법 설명.

Elastic/Elasticsearch 2012. 12. 20. 10:16

그냥 facet search 보다 얻어 걸린 내용인데요.
스크랩용으로 ^^;

http://nandaro.tistory.com/
요기 가보시면 아래 내용 포함해서 더 좋은 글들이 많이 있습니다.


(가) 향상된 검색(Search) 방법

     - 전문검색(Full-Text Search)이 아닌 토픽(Topic)에 의한 의미검색(Semantic Search) 실행
        : 온톨로지를 이용한 추론(reasoning) 적용
     - 검색된 토픽의 분류(Classification)에 의한 그룹(Group)화된 검색 결과 표현
        : 온톨로지(Ontology)의 인스턴스(Instance)들로 표현된 검색결과 또는 인스턴스(Ontology Instance)의 자원(Occurrence)들로 표현된 결과
     - 토픽 검색을 위한 추천어(Suggest Topic) 제공
        : 검색을 위한 추천 키워드(주제어 자동완성 기능) 또는 검색 결과에서 연관성을 이용하여 네비게이션이 가능한 검색어 관련 추천어 제공
     - 패싯 분류(Facet Classification) 및 검색(Facet Search) 실행
        : 서로 다른 성질의 데이터중 서로 공통인 부분만으로 분류 또는 검색

   (나) 네비게이션(Navigation) 방법

     - 단방향 계층적(Strict Hierarchy) 네비게이션을 회피(쌍방향 네비게이션)
     - 유용한 의미를 지닌 관련 콘텐츠로 링크(Link)
     - 그룹의 성격을 지닌 콘텐츠는 관련된 그룹으로 연결
     - 제작 과정을 간략화 : 수천개의 수작업 링크는 배제
     - 향상된 링크(연결) 관리 : 연결되지 않은(Broken) 링크 체크 및 배제

   (다) 콘텐츠 통합(Information Integration)

     - 단일화된 뷰(View)에 표현되는 이형질의 콘텐츠를 통합하는 지식 허브(Hub)로서 토픽맵을 제작(분산된 지식도 통합 가능)
     - 사용자 사례 중심의 콘텐츠 표현
       : 온톨로지의 인스턴스와 관련되는 콘텐츠를 사용자 관점에서 표현(어플리케이션 통합도 가능)
     - 토픽맵 기반의 시맨틱웹 사이트에서 표현되는 통합된 정보의 제목 또는 콘텐츠를 사용자 관점에서 적절히 선택

: