Elasticsearch: На запрос с фильтрацией влияет релевантность записей, которых нет в фильтре? - PullRequest
2 голосов
/ 29 марта 2020

Представьте, что у меня есть три набора данных (SetA, SetB, Set C) и три клиента. Мой первый клиент имеет доступ к SetA и SetB, мой второй клиент имеет доступ к SetA и Set C, а третий использует SetB и Set C. Я мог бы создать индекс эластичного поиска для каждого клиента, чтобы у каждого индекса были следующие наборы данных ...

Index1    Index2    Index3
------    ------    ------
SetA      SetA      SetB
SetB      SetC      SetC

Затем я запрашиваю правильный индекс на основе клиента. Это просто, но требует дублирования данных.

Вместо этого я мог бы создать один индекс со всеми тремя наборами данных.

Index
-----
SetA 
SetB
SetC

Затем я бы добавил фильтрацию в запрос так что для результатов рассматриваются только записи из правильных наборов. Это будет работать, но я обеспокоен тем, что это решение с одним индексом не даст идентичные результаты для запросов, как это было бы для подхода с несколькими индексами. собирается принять во внимание все записи в индексе, когда речь идет о внутренней оценке, как релевантность и частота. Поэтому единый индекс с фильтрацией не даст идентичных результатов для многоиндексного подхода. Это предположение верно?

1 Ответ

1 голос
/ 29 марта 2020

Если вы сначала отфильтруете результаты на основе вашего идентификатора клиента, а затем только выполните поиск, то это не повлияет на релевантность, и вы можете и вам следует объединить эти данные в Elasticsearch, а не создавать 3. различные индексы для этой цели.

Вы можете узнать больше о запросах и фильтрах contextx t и их влиянии на оценку.

Позвольте мне показать вам на небольшом примере:

Индекс def

{
    "mappings": {
        "properties": {
            "setA": {
                "type": "text"
            },
            "setB": {
                "type": "text"
            },
            "setC": {
                "type": "text"
            },
            "customer-id": {
                "type": "long"
            }
        }
    }
}

Индексировать два образца документов для каждого клиента

{
    "setA" : "first customer",
    "setB" : "first customer",
    "setC" : "",
    "customer-id" : 1
}

{
    "setA" : "first customer set A",
    "setB" : "first customer set B",
    "setC" : "",
    "customer-id" : 1
}

{
    "setA" : "second customer",
    "setC" : "second customer",
    "customer-id" : 2
}

{
    "setA" : "second customer set A",
    "setC" : "second customer set C",
    "customer-id" : 2
}
{
    "setB" : "third customer",
    "setC" : "third customer",
    "customer-id" : 3
}

{
    "setB" : "third customer set A",
    "setC" : "third customer set C",
    "customer-id" : 3
}

Поиск запроса с помощью первой фильтрации Первый клиент, а затем поиск с оценкой релевантности

{
    "query": {
        "bool": {
            "must": [ --> this would match and order according to relevance score
                {
                    "match": {
                        "setA": "first"
                    }
                }
            ],
            "filter": [ --> this is used for filtering all docs for cust-1
                {
                    "term": {
                        "customer-id": 1
                    }
                }
            ]
        }
    }
}

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

 "hits": [
            {
                "_index": "so_query_filter",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.8025915, --> relevance is high
                "_source": {
                    "setA": "first customer",
                    "setB": "first customer",
                    "setC": "",
                    "customer-id": 1 --> only cust-1 doc
                }
            },
            {
                "_index": "so_query_filter",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.60996956, -> relavance is low as more words than first
                "_source": {
                    "setA": "first customer set A",
                    "setB": "first customer set B",
                    "setC": "",
                    "customer-id": 1 --> only cust-1 doc
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...