简体   繁体   中英

OrientDB Lucene Index very slow

I have a database with 100.000+ records. I want to index them on two fields with Lucene, so I added the following index:

create index Book.search on Book (title,isbn) FULLTEXT ENGINE LUCENE

However, when I search on one of the fields using the following query:

select from Book where [title,isbn] LUCENE "android"

The query is taking a very long time, like it's doing a full table scan. If I use the explain plan, it also suggests that's it's doing that:

explain select from Book where [title,isbn] LUCENE "android"

Result:

{
    "result": [
        {
            "@type": "d",
            "@version": 0,
            "documentReads": 80551,
            "current": "#16:217944",
            "documentAnalyzedCompatibleClass": 80551,
            "recordReads": 80551,
            "_memoryIndex": "isbn:\n\t'[61 6c 6c 61]':1: [(1)]\n\t'[63 6f 6d 70 6c 65 74 6f]':1: [(6)]\n\t'[63 6f 6e]':1: [(3)]\n\t'[63 6f 72 73 6f]':1: [(5)]\n\t'[65 64 69 74 69 6f 6e]':1: [(15)]\n\t'[67 75 69 64 61]':1: [(0)]\n\t'[69 6d 70 61 72 61 72 65]':1: [(8)]\n\t'[69 74 61 6c 69 61 6e]':1: [(14)]\n\t'[70 65 72]':1: [(7)]\n\t'[70 6f 63 6f]':1: [(12)]\n\t'[70 72 6f 67 72 61 6d 6d 61 72 65]':1: [(10)]\n\t'[70 72 6f 67 72 61 6d 6d 61 7a 69 6f 6e 65]':1: [(2)]\n\t'[72]':1: [(4)]\n\t'[74 65 6d 70 6f]':1: [(13)]\n\tterms=14, positions=14, memory=32.9 KB\ntitle:\n\t'[31 35 33 30 30 35 38 32 33 36]':1: [(0)]\n\tterms=1, positions=1, memory=32.9 KB\n\nfields=2, terms=15, positions=15, memory=66.6 KB",
            "fetchingFromTargetElapsed": 17037,
            "evaluated": 80551,
            "user": "#5:0",
            "tips": [
                "Query 'SELECT FROM Book WHERE [title, isbn] LUCENE \"android\"' fetched more than 50000 records: to speed up the execution, create an index or change the query to use an existent index"
            ],
            "elapsed": 17040.559,
            "resultType": "collection",
            "resultSize": 848,
            "@fieldTypes": "documentReads=l,current=x,documentAnalyzedCompatibleClass=l,recordReads=l,fetchingFromTargetElapsed=l,evaluated=l,user=x,elapsed=f"
        }
    ],
    "warnings": [
        "Query 'SELECT FROM Book WHERE [title, isbn] LUCENE \"android\"' fetched more than 50000 records: to speed up the execution, create an index or change the query to use an existent index"
    ],
    "notification": "Query executed in 17.686 sec. Returned 1 record(s)"
}

What am I missing here?

From your explain there is no index involved. So yes it is doing the scan

From the picture of your indexes i saw that the fields are declared in this order [isbn,title]

This should solve it:

select count(1) from Book where [isbn,title] LUCENE "android"

I tried to replicate your problem with 96000 records. I used OrientDb 2.1.12.

Class book

在此处输入图片说明

I inserted a book with title "android" and isbn "12345"

The query select from Book where [title,isbn] LUCENE "android" it was performed quickly

在此处输入图片说明

With explain

{
    "result": [
        {
            "@type": "d",
            "@version": 0,
            "documentReads": 1,
            "fullySortedByIndex": false,
            "documentAnalyzedCompatibleClass": 1,
            "recordReads": 1,
            "Book_search_totalHits": 1,
            "luceneIndex": true,
            "fetchingFromTargetElapsed": 16,
            "indexIsUsedInOrderBy": false,
            "score": 8.087625,
            "current": "#12:140533",
            "totalHits": 1,
            "_memoryIndex": "isbn:\n\t'[31 32 33 34 35]':1: [(0)]\n\tterms=1, positions=1, memory=32.9 KB\ntitle:\n\t'[61 6e 64 72 6f 69 64]':1: [(0)]\n\tterms=1, positions=1, memory=32.9 KB\n\nfields=2, terms=2, positions=2, memory=66.5 KB",
            "involvedIndexes": [
                "Book.search"
            ],
            "limit": -1,
            "evaluated": 1,
            "user": "#5:0",
            "elapsed": 11.263393,
            "resultType": "document",
            "resultSize": 1,
            "@fieldTypes": "documentReads=l,documentAnalyzedCompatibleClass=l,recordReads=l,fetchingFromTargetElapsed=l,score=f,current=x,involvedIndexes=e,evaluated=l,user=x,elapsed=f"
        }
    ],
    "notification": "Query executed in 0.042 sec. Returned 1 record(s)"
}

How many records do you have with the title that contains "android" ? Are they more than 50000 ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM