Почему filterQuery не работает в клиенте REST высокого уровня поиска Elasti c для JAVA? - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь создать функцию запускает нечеткий поиск в Elasti c Поисковый индекс. Я получаю совпадение только в том случае, если я укажу термин точно так, как он записан в индексе. Если я намеренно неверно введу одну букву в этом термине, например

"Bo c"

, я думаю, что нечеткий поиск все равно должен вернуть то же совпадение, но вместо этого это не возвращает ни одного. С другой стороны, если я заменю fuzzyMatch на prefixQuery или termQuery, поиск вернет результат только в том случае, если задано точное написание

"Bob"

Почему это так? Как я могу это исправить? И где находится документация, объясняющая эти методы?

Вот мой код ...

public void searchResults(@PathParam("index_name") String index_name) throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.fuzzyQuery("firstname", "Bob"));
    sourceBuilder.from(0);
    sourceBuilder.size(numberOfSearchHitsToReturn);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    SearchRequest searchRequest = new SearchRequest(index_name).source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.print(searchResponse);
    client.close();
}

Вот результат Get / index / _search в Почтальоне ...

{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "J1NDonABNQ4iHt4UOM4u",
                "_score": 1.0,
                "_source": {}
            },
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "153",
                "_score": 1.0,
                "_source": {
                    "firstname": "Bob",
                    "home_city": "San Diego",
                    "home_address": "1029 Loring Street",
                    "home_zip": "92109",
                    "contact_id": "153",
                    "email": "bsmith@gmail.com",
                    "lastname": "Smith",
                    "home_state": "California",
                    "cell_phone": "6192542981"
                }
            },
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "154",
                "_score": 1.0,
                "_source": {
                    "firstname": "Alice",
                    "home_city": "Paia",
                    "home_address": "581 Pili Loko Street",
                    "home_zip": "00012",
                    "contact_id": "154",
                    "email": "aHernes@gmail.com",
                    "lastname": "Hernes",
                    "home_state": "Hawaii",
                    "cell_phone": "8083829103"
                }
            }
        ]
    }
}

1 Ответ

0 голосов
/ 04 марта 2020

Я полагаю, что elasti c немного смущает вас.

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

Таким образом, вычисленное расстояние Левенштейна между "Bo c" и "bob" равно 2 , поэтому он не возвращается.

Попробуйте ввести строчные буквы, и я уверен, что "Боб" будет возвращен.

// no results
{
    "query": {
       "fuzzy" : { "firstname" : "Boc" }
    }
}
// "Bob" returned
{
    "query": {
       "fuzzy" : { "firstname" : "boc" }
    }
}

Имеет ли это смысл?

Относительно вашего кода:

public void searchResults(@PathParam("index_name") String index_name) throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // "Boc".toLowerCase() or simply "boc"
    sourceBuilder.query(QueryBuilders.fuzzyQuery("firstname", "Boc".toLowerCase()));
    sourceBuilder.from(0);
    sourceBuilder.size(numberOfSearchHitsToReturn);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    SearchRequest searchRequest = new SearchRequest(index_name).source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.print(searchResponse);
    client.close();
}
...