ElasticSearch: почему нельзя получить предложение по критериям? - PullRequest
1 голос
/ 31 марта 2020

Я хочу получить предложения из некоторого текста для конкретного пользователя. Как я понимаю, Elasticsearch предлагает предложения на основе всего словаря (инвертированный индекс), который содержит все термины в индексе.

Так что, если user1 публикует некоторый текст, этот текст может быть предложен пользователю2. Я прав?

Можно ли добавить фильтр по критериям (например, по пользователю), чтобы уменьшить набор предлагаемых терминов?

1 Ответ

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

Да, это очень возможно, позвольте мне показать вам пример, который использует запрос с контекстом фильтра :

Index def

{
    "mappings": {
        "properties": {
            "title": {
                "type": "text" --> inverted index for storing suggestions on title field
            },
            "userId" : {
                "type" : "keyword" --> like in you example
            }
        }
    }
}

Index sample do c

{
    "title" : "foo baz",
    "userId" : "katrin"
}

{
    "title" : "foo bar",
    "userId" : "opster"
}

Поисковый запрос без фильтра userId

{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "title": "foo"
                }
            }
        }
    }
}

Результаты поиска (объединяют оба результата)

 "hits": [
            {
                "_index": "so_suggest",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.18232156,
                "_source": {
                    "title": "foo bar",
                    "userId": "posted" --> note another user
                }
            },
            {
                "_index": "so_suggest",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.18232156,
                "_source": {
                    "title": "foo baz",
                    "userId": "katrin" -> note user
                }
            }
        ]

Теперь давайте уменьшим предложение на фильтрация документов, созданных пользователем katrin

Поисковый запрос

{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "title": "foo"
                }
            },
            "filter": {. --> note filter on userId field
                "term": {
                    "userId": "katrin"
                }
            }
        }
    }
}

Результат поиска

 "hits": [
            {
                "_index": "so_suggest",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.18232156,
                "_source": {
                    "title": "foo baz",
                    "userId": "katrin"
                }
            }
        ]
...