54
CouchDB and Lucene Index Presented by Sijing Yang Document processing for data mining

CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

CouchDB and Lucene Index

Presented by Sijing Yang

Document processing for data mining

Page 2: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

CouchDBA NoSQL DBMS that does not mimic SQL

Page 3: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Background

- SQL vs. NoSQL

- A refresh on MongoDB

• Introduction

- What is CouchDB and Why

• Data modeling

- CouchDB vs. MongoDB

• Query capabilities

- CouchDB vs. MongoDB

• Concurrency control and Distributed architecture

• Conclusions and Some facts

Overview

1

Page 4: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Data modeling: schema-less - Relational: What answers do we have? (driven by the structure of available data)

- NoSQL: What questions do we have? (driven by application-specific pattern)

• Query capability: - Relational: human user-oriented, query is simple

- NoSQL: application-oriented, query is comparatively complex

• Scalability: - Relational: vertical

- NoSQL: horizontal

Background: SQL vs. NoSQL

2

Page 5: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• NoSQL is naturally fit for big data.

- Unstructured data with similar semantics but varied syntax

- Large volume of data for which scalability is becoming a must and consistency expensive

Background: SQL vs. NoSQL

3

Page 6: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

4

Page 7: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

5

Page 8: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Background: A refresh on MongoDB

Database Collections Documents

or

• Use collections to organize modules

• Normalized (Reference) or denormalized (embedding)

• Strict consistency (All writes must go to primary node)

6

Page 9: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Name comes from: - Cluster Of Unreliable Commodity Hardware

- Relax (in a couch)

• Written in Erlang, initial release in 2005

• Licence: Apache, Original author: Damien Katz, et al.

Introduction: What is CouchDB?

7

Page 10: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• An open source, document-oriented, NoSQL database that uses JSON to store data, JavaScript as its query language, and HTTP for an API.

• Instead of locking mechanism, CouchDB uses MVCC to resolve conflicts, and incremental replication to achieve eventual consistency.

Introduction: What is CouchDB?

8

Page 11: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Availability, Locality and Scalability

• “A database that completely embraces the web.”

Introduction: Why CouchDB?

9

Page 12: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Data Modeling of CouchDB: Overview

• JSON format

• Self-contained data (as opposed to referenced data)

• One big store of documents, no collection layer

• B tree storage engine + MapReduce to compute results of a view

10

Page 13: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• CouchDB: JSON • MongoDB: BSON

Data Modeling of CouchDB: JSON Format

11

Page 14: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• CouchDB: purely self-contained (Say Goodbye to SQL)

• MongoDB: embedded (NoSQL); or referenced (SQL-like)

Data Modeling of CouchDB: Self-contained Data

12

Page 15: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• CouchDB: purely self-contained (Say Goodbye to SQL)

• MongoDB: embedded (NoSQL); or referenced (SQL-like)

email: null

Workers

NAME WAGE Joe 100 Bob 150 …

Materials

NAME PRICE Rod 30 String 20 …

If real-world data is not managed as real-world data

Data Modeling of CouchDB: Self-contained Data

13

Page 16: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• CouchDB: one big warehouse No global indexes predefined on DB level, create a view to report results instead

• MongoDB: separated by collections Can create index for any field of documents in a collection (identical to indexing in RDBMS)

Collection 1

Collection 2

Collection 3

Data Modeling of CouchDB: Data Storage

14

Page 17: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Define a view - Map takes documents and emits key/value pairs

Query Capabilities: How do you aggregate unstructured data?

15

Page 18: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Construct B-tree index - CouchDB storage engine constructs a B-tree index

Query Capabilities: How do you aggregate unstructured data?

16

Page 19: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Query the view - Reduce operates on the subtree to do aggregation

Query Capabilities: How do you aggregate unstructured data?

17

Page 20: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• MapReduce + B-tree = results of a view

Query Capabilities: How do you aggregate unstructured data?

18

Page 21: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Query Capabilities• CouchDB: MapReduce(complex queries)

• MongoDB: (1) Aggregation pipeline(SQL-like)

(2) MapReduce(complex queries)

Well, comparatively complex…19

Page 22: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Futon: Built-in administration interfaceData Management

20

Page 23: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Data Management

• REST API: a thin wrapper around the DB core

REST API

21

Page 24: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Welcome:

Add a new database:

Add a new document:

Get a new UUID: (if don’t have one)

Read a document:

… …

• REST API: a thin wrapper around the DB core

Data Management

22

Page 25: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Concurrency control of CouchDB

• Multi-Version Concurrency Control: - Doesn’t rely on global state, always available to readers; - Each reader is reading the latest visible snapshot

• MongoDB • CouchDB

23

Page 26: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Distributed Architecture of CouchDB

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary

24

Page 27: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online

CouchDBgenerate _rev0

CouchDB

userinsert

Distributed Architecture of CouchDB

25

Page 28: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

reply with _rev0

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online

CouchDBgenerate _rev0

CouchDB

userread

userinsert

Distributed Architecture of CouchDB

26

Page 29: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

reply with _rev0

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online

CouchDBgenerate _rev0

CouchDB

userread

userinsert

Sync

Distributed Architecture of CouchDB

27

Page 30: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

append _rev1

append _rev1

reply with _rev0

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online - Automatic conflict detection and resolution

CouchDBgenerate _rev0

CouchDB

userwrite

userread

reply with _rev0

userinsert

userdelete

reply with _rev0

Distributed Architecture of CouchDB

28

Page 31: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

reply with _rev1(B)append _rev1

append _rev1

reply with _rev0CouchDB

generate _rev0

CouchDB

userwrite

userread

reply with _rev0

userinsert

userdelete

reply with _rev0userread

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online - Automatic conflict detection and resolution

Distributed Architecture of CouchDB

29

Page 32: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

reply with _rev1(B)append _rev1

append _rev1

reply with _rev0CouchDB

generate _rev0

CouchDB

userwrite

userread

reply with _rev0

userinsert

userdelete

reply with _rev0

Sync Conflict!

userread

• Eventual consistency by incremental replication: - Peer-to-peer rather than primary-secondary - Sites can go offline, DB will handle sync when back online - Automatic conflict detection and resolution

Distributed Architecture of CouchDB

30

Page 33: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Conclusions

MongoDB CouchDB

Focus Consistency Availability

Distributed architecture Primary-Secondary replication

Peer-Peer synchronization

Concurrency control Update in-place (much like SQL) MVCC

Document format BSON JSON

Data storage Referenced or embedded Self-contained

Data organization One extra layer: collections

Everything piled together

Query capabilities Aggregation pipeline or MapReduce

MapReduce views and indexes

CRUD syntax SQL-like HTTP methods

31

Page 34: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Some facts: Popularity

(Stopped using in 2011…)

32

Page 35: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Some facts: Efficiency

33

Page 36: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

When to use what?

• You have some predefined queries upfront, want to run on occasionally changing data;

• Need to make sure that sites are always available, even if data center crashes;

• Need to replicate data bi-directionally between 2 or more data centers;

• If versioning is important;

• You are familiar with HTTP but not SQL;

• You are a geek and you believe RDBMS is outdated.

34

Page 37: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

When to use what?

• All other cases when you need a distributed DBMS

35

Page 38: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Lucene IndexA rich and powerful full-text search toolbox

Page 39: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• Background: Why full text search?

• Introduction: What Lucene Index is and is not

• Lucene Workflow

• Lucene API and Functionalities

• Some other useful resources

Overview

36

Page 40: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Background: Why full text search?

• Option 1: Read through 10000 pages of Help documentation

• Option 2: Type the term in the search field

Question: How do you search for a term in documentation?

Lucky enough.

Eclipse help system supports option 2.

What they use is Lucene Index.

37

Page 41: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Question: What if you want to search for a term in a disk of 100G? • Option 1: grep => couple hours

• Option 2: Create an index => milliseconds

Question: How do you want the result to be reported? • Option 1: A long list of all matched hits

• Option 2: Aggregated? Sorted? Filtered?

Background: Why full text search?

38

Page 42: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

3 Fundamental Questions

• What do you put in the index?

• How do you create the index?

• How do you search the index?

Background: Why full text search?

39

Page 43: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

• An open source, cross-platform full-text indexing and search library in Java

• Licence: Apache, Original author: Doug Cutting

• Widely recognized for implementing both Internet search engines and local single-site searching

• Lucene is not a search engine. It is not an application.

Introduction: What Lucene Index is and is not

40

Page 44: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Lucene Index workflow

Create indexon documents(core of Lucene) Parse query

and answer

Flexible documentformat:HTTP, PDF, metadata, etc.

Rich,powerfulsearch algorithms,Easy-to-useAPI for query

41

Page 45: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Indexing Fundamentals

INDEXING FUNDAMENTALS

• An index is maintained for a collection of documents

• A document is a collection of fields

• A field is a named collection of terms

• A term is a paired string: <field, term-string>

• Inverted index for efficient term-based search

42

Page 46: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Lucene API

STEP 1: CREATE INDEX

• Document: a record.

• Field: features of a record.

• Analyzer: parse each field into indexable tokens

• IndexWriter: create index and add new index entries

• Directory: where index is stored

43

Page 47: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

source: http://www.slideshare.net/slidesharekv/lucene-apache?related=1 44

Page 48: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

source: http://www.slideshare.net/slidesharekv/lucene-apache?related=145

Page 49: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

STEP 2: QUERY INDEX

• Query: parse query string

• Term: basic unit for search

• TermQuery: subclass for query operation

• IndexSearcher: search in a built index

• Hits: store search results

Lucene API

46

Page 50: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

source: http://www.slideshare.net/slidesharekv/lucene-apache?related=147

Page 51: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

source: http://www.slideshare.net/slidesharekv/lucene-apache?related=148

Page 52: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Lucene algorithms

source: http://www.slideshare.net/prasen.bea/lucece-indexing 49

Page 53: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

Integration of CouchDB and Lucene Index

An open source project for full-text indexing CouchDB:

https://github.com/rnewson/couchdb-lucene

(Outperforms MongoDB this time!)

50

Page 54: CouchDB and Lucene Index - web.cs.wpi.eduweb.cs.wpi.edu/~cs585/s15/Lectures/W14/CouchDB_Lucene.pdf · • Introduction - What is CouchDB and Why • Data modeling - CouchDB vs. MongoDB

REFERENCES

CouchDB:

• CouchDB: The Definitive Guide

• http://couchdb.apache.org/

• https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/

• http://blog.scottlogic.com/2014/08/04/mongodb-vs-couchdb.html

• http://openmymind.net/2011/10/27/A-MongoDB-Guy-Learns-CouchDB/

Lucene Index:

• https://lucene.apache.org/core/documentation.html

• http://www.cnblogs.com/forfuture1978/archive/2010/04/04/1704282.html

51