How to Use ElasticSearch with MongoDB (with highlights)

I need to index in realtime pdf documents from MongoDB by means of ElasticSearch. Here I want to describe my experience with these tools.

Mongo

First of all, install mongo from 10gen repo. You can find more information on this link http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/

Next, open /etc/mongodb.conf and add

replSet=rs0

After that, restart mongo service.

ElasticSearch

Grab deb package from ES web site and install it. Then go here https://github.com/richardwilly98/elasticsearch-river-mongodb/wiki#install-guide and follow instructions to  install mapper and river plugin. After that restart ES service.

ElasticSearch Configuration

drop all indexes:

curl -XDELETE 'http://localhost:9200/_all'

create index:

curl -XPUT 'http://localhost:9200/mongoindex'

add mapping:

curl -XPUT 'http://localhost:9200/mongoindex/files/_mapping' -d '{
"files": {
"properties": {
"content": {
"path": "full",
"type": "attachment",
"fields": {
"title" : { "store" : "yes" },
"file" : { "term_vector":"with_positions_offsets", "store":"yes" },
"content": {
"type": "string",
"term_vector":"with_positions_offsets", "store":"yes"
},
"author": {
"type": "string"
},
"keywords": {
"type": "string"
},
"name": {
"type": "string"
},
"date": {
"format": "dateOptionalTime",
"type": "date"
},
"content_type": {
"type": "string"
}
},

"chunkSize": {

"type": "long"
},
"md5": {
"type": "string"
},
"length": {
"type": "long"
},
"filename": {
"type": "string"
},
"contentType": {
"type": "string"
},
"uploadDate": {
"format": "dateOptionalTime",
"type": "date"
},
"metadata": {
"dynamic": "true",
"type": "object"
}
}
}
}}'

configure river:

curl -XPUT 'http://localhost:9200/_river/mongodb/_meta' -d '{ "type": "mongodb",
"mongodb": {
"db": "testmongo",
"collection": "fs",
"gridfs": true
},
"index": {
"name": "mongoindex",
"type": "files"
}
}'

 

Putting data and  queering

add file to GridFS:

mongofiles --host localhost:27017 --db testmongo --collection fs --type applicaton/pdf put ~/Downloads/papers/fulltefffxt.pdf

get all documents with word "science":

curl -XGET 'http://localhost:9200/mongoindex/files/_search?pretty=1' -d '{"fields":["filename","title"],"query":{"query_string":{"query":"science"}},"highlight":{"fields":{"content":{}}}}'

result:

{
"took" : 21,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 26,
"max_score" : 0.03614504,
"hits" : [ {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a78b6e28f2c0ab6e08344",
"_score" : 0.03614504,
"fields" : {
"filename" : "/home/hudvin/Downloads/Bioinformatics-2010-Attwood-i568-74.pdf",
"content.title" : "G:\\bioinformatics\\Bioinfo-ECCB(suppl-26)\\btq383.dvi"
},
"highlight" : {
"content" : [ "Computer <em>Science</em>, 2Faculty of Life Sciences, 3School of Chemistry, University of Manchester, Oxford\nRoad", "of life-<em>science</em> data, and an\nincreasingly impenetrable mass of biomedical literature describing\nand analysing", "major life-<em>science</em> databases as a federated linked-\ndata network accessible via SPARQL and REST interfaces", "‘semantic’) life-<em>science</em> PDF articles (Kumar et al., 2008;\nRuthensteiner and Hess, 2008) that use Adobe Acrobat’s", "publishing. <em>Science</em>, 325, 828–832.\n\nRuthensteiner,B. and Hess,M. (2008) Embedding 3D models of biological specimens" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a7defdf305602c763f9e1",
"_score" : 0.028667428,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a9533c75c3fdd3266d2d9",
"_score" : 0.028667428,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516ab87b3e1dd880e5e36af0",
"_score" : 0.028667428,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a805df5f9c539b776dfbd",
"_score" : 0.027710661,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516aa867cd7fe2a0b8ef01d7",
"_score" : 0.027710661,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516ab867046c734c84b300cc",
"_score" : 0.027710661,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a788642d6cf3b3779d1e6",
"_score" : 0.024997447,
"fields" : {
"filename" : "/home/hudvin/Downloads/Bioinformatics-2010-Attwood-i568-74.pdf",
"content.title" : "G:\\bioinformatics\\Bioinfo-ECCB(suppl-26)\\btq383.dvi"
},
"highlight" : {
"content" : [ "Computer <em>Science</em>, 2Faculty of Life Sciences, 3School of Chemistry, University of Manchester, Oxford\nRoad", "of life-<em>science</em> data, and an\nincreasingly impenetrable mass of biomedical literature describing\nand analysing", "major life-<em>science</em> databases as a federated linked-\ndata network accessible via SPARQL and REST interfaces", "‘semantic’) life-<em>science</em> PDF articles (Kumar et al., 2008;\nRuthensteiner and Hess, 2008) that use Adobe Acrobat’s", "publishing. <em>Science</em>, 325, 828–832.\n\nRuthensteiner,B. and Hess,M. (2008) Embedding 3D models of biological specimens" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a8a34f93f9316ac041083",
"_score" : 0.0234375,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
}, {
"_index" : "mongoindex",
"_type" : "files",
"_id" : "516a8a8a12d92e1384be8ca9",
"_score" : 0.0234375,
"fields" : {
"filename" : "/home/hudvin/Downloads/papers/fulltefffxt.pdf",
"content.title" : "SEVEN CRITICAL CHALLENGES FOR NLP"
},
"highlight" : {
"content" : [ "emerging <em>science</em> of Geology, the comparative anatomy and idea of homology first articulated by \nGoethe,", "change <em>Science</em> and Behaviour Books, Palo alto. \n\nGrinder, J., DeLozier, J., & Bandler, R. 1977, Patterns", "\"NLP and <em>Science</em>: six recommendations for a better relationship\", NLP \nWorld, vol. 6, no. 3, pp. 45-75.", "Therapy <em>Science</em> and Behavior Books, \nPalo Alto. \n\nPeters, T. & Waterman, R. 1982, In Search of Excellence" ]
}
} ]
}
}

Files are avaliable at http://localhost:9200/mongoindex/files/516a805df5f9c539b776dfbd?pretty=true

Also, you can run query from browser http://localhost:9200/mongoindex/_search?q=content:science&pretty=true

 

Hello, GitHub!

Решил перенести свои проекты с битбакета на гитхаб. Мой аккаунт - https://github.com/hudvin

Nomad

Проект, над которым я сейчас работаю. Представляет собой краулер, который позволяет гибко настраивать правила скачивания и дает доступ к графу ссылок. Будет применяться как источник данных для FireFly.

Ссылка: https://github.com/hudvin/nomad

Презентация: https://docs.google.com/file/d/0B6a-NOsilC9Hd2NPeUszR1VIaE0/edit&usp=sharing

 

FireFly

Предназначен для автоматического анализа научных статей, поиска связей, каталогизации и топу подобное. Возможно станет частью Deniga.

Ссылка:

  1. firefly-core (бекенд): https://github.com/hudvin/firefly-core
  2. firefly-ui(фроненд): https://github.com/hudvin/firefly-ui

Презентация: https://docs.google.com/file/d/0B6a-NOsilC9HSjFtX3otTDJrU2s/edit?usp=sharing

 

 

Серия статей об искусственном интелллекте и мозге

С 2007-2008 я начал интересоваться вопросами искусственного интеллекта. В тот момент эта отрасль представлялась мне черным ящиком или волшебной палочкой, возможности которой достаточны для уравнивания возможностей компьютера с возможностями человеческого мозга. Я начал активно разбираться в существующих подходах, методих и алгоритмах. Постепенно ко мне стало приходить ощущение, что с искусственным интеллектом в науке "Искусственный интеллект" очень искусственно. Самые лучшие алгоритмы, способные к самообучению и адаптации, на практике оказывались тупее комара. Сравниваю с комаром, потому что сравнивать с мухой это тоже самое, что сравнивать бумажный кораблик, предназначенный для гонок в ванне, со спортивным катером. В каждой из отраслей - в компьютерном зрении, распознании речи, вычислительной лингвистике, планировании, навигации - существовуют свои собственные, независимые алгоритмы, не использующие общих подходов. Но искусственный интеллект задумывался как инструмент, как метаалгоритм, который бы сам смог создавать решения и который бы, таким образом, был бы общим решением всех проблем, связанных с интеллектуальным поведением.

Но развитие пошло по другому пути. У нас есть всего лишь множество алгоритмов, решающих частные проблемы.

Структура ДНК впервые была расшифрована в 1953 году. С тех пор мы открыли клонирование, научились находить генетические причины многих болезней, разрабатываем генную терапию, клонирование органов, подбираемся к лечению СПИДА и рака. Самые передовые отряды ученых заняты борьбой с процессами старения. Множество проблем еще предстоит решить, но мы видим в каком направлении двигаться, знаем как думать о попадающихся проблемах и как искать их решения.

Формально, наука "искусственный интеллект" была создана в 1956 году. Неформально начало было положено в 1950 году статьей Алана Тьюринга "Может ли машина мыслить?" 60 лет спустя ИИ все еще находится в зачаточном состоянии. Самые лучшие ИИ-агенты непроходимо тупы, глухи, слепы и бесконечно далеки в своих возможностях от биологических собратьев. Никакой самостоятельности нет и в помине.

Почему же на сегодняшний день проще создать бессмертного человека, чем робота с интеллектом кошки? Почему препятствия на пути к созданию ИИ выглядят как идеальная стена с бесконечной длиной, высотой и толщиной? Что нужно, чтобы пробить эту стену? Пошло ли что-то не так в самом начале? Был ли другой путь?

С 2007 года я перечитал множество книг по работе мозга, психологии, психиатрии, искусственном интеллекту, робототехнике, сингулярности и трансгуманизму. В последующих 10-15 заметках я хочу поделиться своими заметками, выводами и размышлениями об этих отраслях. Заметки слабо связаны и представляют собой освещение проблемы ИИ с разных сторон.

Статьи будут размещаться в категории "What's wrong?"

Nomad: веб-краулер

Осенью прошлого года я задумал проект поисковика по academic papers. Первоначально планировалось реализовать поиск на базе ElasticSearch, автоматическую категоризацию, извлечение ссылок, имен, поиск похожих статей с помощью LSI(gensim), списки и  пр. Для сбора статей планировал использовать один из двух краулеров - либо Apache Nutch, либо Heritrix. Но после пары недель экспериментов выяснилось, что для моих целей они не очень подходят:

  1. сложная конфигурация с множеством недокументированных возможностей
  2. низкая производительсноть
  3. невозможнсть гибко настраивать логику краулинга и фильтрацию ссылок.м
  4. отсутствие API для доступа к скачаным данным
  5. отсутствие доступа к графу ссылок

Когда стало очевидно, что эти недостатки устранить крайне трудно,  пришлось взяться за написание собственного краулера, который был назван Nomad.  Основые фичи(как планируемые, так и уже реализованные) проекта:

  1. Язык - Scala(сделано)
  2. Возможность скриптования логики обхода и фильтрации ссылок(сделано)
  3. Хранение графа ссылок в GraphDB(сделано)
  4. Хранение скачанный файлов  в GridFS(сделано)
  5. API для доступа к графу и файлам
  6. Распределенный краулинг в кластере
  7. Поддержка robots.txt(сделано)
  8. Параллельный краулинг нескольких доменов
  9. Восстановление при перезапуске
  10. Консоль или UI для управления

Презентация на Google Docs

Проект на BitBucket 

В будущем, возможно, создам отдельный сайт под проект и перенесу код на github.

Denigma - a starting point for deciphering Aging

Пару недель назад я повесил в местном Scala-community сообщение о поиске людей для написания веб-краулера. Откликнулось два человека, с одним из которых(Антон Калуга) я и разговорился. Он мне рассказал о проекте denigma, цель которого - сбор и систематизация всей известной информации о процессах старения.

Описание с denigma.de

Denigma is a Project of the International Longevity Alliance intended to provide a starting point for deciphering Aging. By integrating all the heterogeneous types of biological data and applying a robust unification schema as well as utilizing the increasingly computational power for logical inference, it will be possible to solve biological problems, primarily Aging and aging-related diseases as well as suffering due to other reasons. o

This is an Open Source Project providing a platform for both life Scientists and computational Developers as well as Artists in order to address the fundamental questions of life and to systematically reveal its secrets. Denigma particular encourages data evolution. Nothing is perfect from the beginning, besides the concept of Denigma. Denigma is as strong as diamond and as flexible as carbon-fiber, but in its very heart its all silicon.

В данный момент в проекте участвует примерно 5 человек(биологи и программисты).

Технические направления:

  • Визуализация связей, разработка интерфейся для работы с данными
  • Написание библиотек для работы с большими графами
  • Хранение и анализ онтологий
  • Анализ возможностей  применения semantic web

Постепенно формируется организационная структура проекта.

Моя деятельность сконцентирована на следующем:

  • Написание клаулера для сбора academic papers со всех интернетов. О краулере я напишу в одной из следующих статей
  • Применение Data Mining и NLP для анализа и категоризации статей.
  • Поисковый движок на базе ElasticSearch 

Используемые языки и технологии: Scala, Python, Django, CoffeScript, NoSQL, Graph DBs.

Если есть желание поучаствовать, пишите на hudvin@gmail.com

 

AIKharkov#4. Искусственный интеллект в играх

26 января 2013 мы проводили четвертую встречу AIKharkov. По ошибке дата проведения совпала с KharkovPy, поэтому пришлось срочно искать другое помещение. Осталоновились на GlobalLogic(да простит меня Ciklum!). Две компании находится буквально в 10 минутах хотьбы друг от друга, поэтому никаких значительных неудобств не было. Впервые получилось сделать нормальную видеозапись презентаций. Я пытался воспользоваться зеркалкой, но ничего приличного не получилось. Использовали обычную HD камеру. Также хотели организовать live трансляцию, но, во-первых, Youtube Live оказался недоступен, во-вторых, не получилось транслировать видеосигнал на компьютер.

Встреча, безусловно, была одной из самых интересных.

Первый доклад был посвящен поискам оптимальных путей в играх, обзору потенцильных проблем и их решений.
Автор - Владимир Кожаев, "Поиск пути: проблемы и решения"

Второй доклал был посвящен практическим и теоретическим особенностям искусственного интеллекта в играх S.T.A.L.K.E.R. и Survarium. Были рассмотрены вопросы реализации навигации, освещения, интеллекта ботов. Также было очень интересно узнать о багах вроде попадания гранаты в форточку со ста метров. Я не любитель игр, но после этой презентации появилось желание пройти Сталкера как минимум для того, чтобы обратить внимание на особенности, о которых рассказывал Дмитрий.
Автор - Дмитрий Ясенев, "ИИ для персонажей онлайн шутера Survarium", презентация доступна здесь

Выражаю Владимиру и Дмитрию огромное спасибо! Было очень интересно и увлекательно.

Осталось только придумать, как в слудующий раз держать планку, поднятую так высоко.

Scala Links

http://scalamacros.org/

https://github.com/jorgeortiz85/scala-time

(2.hours + 45.minutes + 10.seconds).millis

http://scalaquery.org/

Scala ORM http://squeryl.org/

http://slick.typesafe.com/

https://github.com/scalaz/scalaz

SBT

ScalaTest

List of libs https://wiki.scala-lang.org/display/SW/Tools+and+Libraries

http://spray.io/

http://software.clapper.org/grizzled-scala/

Code Snippets

Iterate over stream

  val out = new FileOutputStream(new File("/tmp/cons/" + path))
          Iterator
            .continually(entity.getContent.read)
            .takeWhile(-1 !=)
            .foreach(out.write)

http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types

type or[L,R] = Either[L,R]

implicit def l2Or[L,R](l: L): L or R = Left(l)
implicit def r2Or[L,R](r: R): L or R = Right(r)

object Bar {
   def foo(xs: (String or Int)*) = xs foreach {
      case Left(l) => println("str")
      case Right(r) => println("int")
   }
}

class StringOrInt[T]
object StringOrInt {
  implicit object IntWitness extends StringOrInt[Int]
  implicit object StringWitness extends StringOrInt[String]
}

object Bar {
  def foo[T: StringOrInt](x: T) = x match {
    case _: String => println("str")
    case _: Int => println("int")
  }
}

http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/

http://stackoverflow.com/questions/932701/scala-two-methods-different-parameter-types-but-same-code-how-to-unify

Враппер для распаковщиков

Для того, чтобы не вспоминать, чем и как распаковать архив, можно использовать враппер unp. Он самостоятельно проанализирует тип архива и выберет подходящий распаковщик.

Установка в Debian

sudo apt-get install unp