Как выполнить запрос simple_query_string / query_string - PullRequest
6 голосов
/ 01 ноября 2019

Индекс:

{
    "settings": {
        "index.percolator.map_unmapped_fields_as_text": true,
    },
    "mappings": {
        "properties": {
            "query": {
                "type": "percolator"
            }
        }
    }
}

Этот тестовый перколяционный запрос работает

{
    "query": {
        "match": {
            "message": "blah"
        }
    }
}

Этот запрос не работает

{
    "query": {
        "simple_query_string": {
            "query": "bl*"
        }
    }
}

Результаты:

{"took":15,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.13076457,"hits":[{"_index":"my-index","_type":"_doc","_id":"1","_score":0.13076457,"_source":{"query":{"match":{"message":"blah"}}},"fields":{"_percolator_document_slot":[0]}}]}}

Почему этот запрос simple_query_string не соответствует документу?

1 Ответ

3 голосов
/ 04 ноября 2019

Я тоже не понимаю, о чем вы спрашиваете. Может быть, вы не очень хорошо понимаете перколятор? Это пример, который я только что попробовал.

Предположим, у вас есть индекс - назовем его test - в котором вы хотите проиндексировать некоторые документы. Этот индекс имеет следующее отображение (просто случайный индекс теста, который я имею в моей настройке теста):

{  
    "settings": {
        "analysis": {
          "filter": {
            "email": {
              "type": "pattern_capture",
              "preserve_original": true,
              "patterns": [
                "([^@]+)",
                "(\\p{L}+)",
                "(\\d+)",
                "@(.+)",
                "([^-@]+)"
              ]
            }
          },
          "analyzer": {
            "email": {
              "tokenizer": "uax_url_email",
              "filter": [
                "email",
                "lowercase",
                "unique"
              ]
            }
          }
        }
      },
    "mappings": {
        "properties": {
            "code": {
                "type": "long"
            },
            "date": {
                "type": "date"
            },
            "part": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "val": {
                "type": "long"
            },
            "email": {
              "type": "text",
              "analyzer": "email"
            }
        }
    }
}

Вы заметили, что у него есть специальный анализатор email, который разбивает что-то вроде foo@bar.com на эти токены:foo@bar.com, foo, bar.com, bar, com.

Как сказано в документации, вы можете создать отдельный индекс перколятора, который будет содержать только ваши запросы перколятора, но не документысамих себя. И даже если индекс перколятора не содержит сами документы, он должен содержать отображение индекса, в котором должны храниться документы (в нашем случае test).

Это отображение перколятораИндекс (который я назвал percolator_index), который также имеет специальный анализатор, используемый для разделения поля email:

{  
    "settings": {
        "analysis": {
          "filter": {
            "email": {
              "type": "pattern_capture",
              "preserve_original": true,
              "patterns": [
                "([^@]+)",
                "(\\p{L}+)",
                "(\\d+)",
                "@(.+)",
                "([^-@]+)"
              ]
            }
          },
          "analyzer": {
            "email": {
              "tokenizer": "uax_url_email",
              "filter": [
                "email",
                "lowercase",
                "unique"
              ]
            }
          }
        }
      },
    "mappings": {
        "properties": {
            "query": {
                "type": "percolator"
            },
            "code": {
                "type": "long"
            },
            "date": {
                "type": "date"
            },
            "part": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "val": {
                "type": "long"
            },
            "email": {
              "type": "text",
              "analyzer": "email"
            }
        }
    }
}

Его отображение и настройки практически совпадают с моим исходным индексом, единственное отличиеявляясь дополнительным полем query типа percolator, добавляемым в отображение.

Интересующий вас запрос - simple_query_string - должен входить в документ внутри percolator_index. Вот так:

PUT /percolator_index/_doc/1?refresh
{
    "query": {
        "simple_query_string" : {
            "query" : "month foo@bar.com",
            "fields": ["part", "email"]
        }
    }
}

Чтобы сделать его более интересным, я добавил туда поле email, которое нужно искать в запросе (по умолчанию все они ищутся).

Теперь цель состоит в том, чтобы протестировать документ, который в конечном итоге должен войти в индекс test, против этого запроса simple_query_string из вашего индекса перколятора. Например:

GET /percolator_index/_search
{
  "query": {
    "percolate": {
      "field": "query",
      "document": {
        "date":"2004-07-31T11:57:52.000Z","part":"month","code":109,"val":0,"email":"foo@bar.com"
      }
    }
  }
}

То, что находится под document, это, очевидно, ваш будущий (еще не существующий) документ. Это будет сопоставлено с определенным выше simple_query_string и приведет к совпадению:

{
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.39324823,
        "hits": [
            {
                "_index": "percolator_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.39324823,
                "_source": {
                    "query": {
                        "simple_query_string": {
                            "query": "month foo@bar.com",
                            "fields": [
                                "part",
                                "email"
                            ]
                        }
                    }
                },
                "fields": {
                    "_percolator_document_slot": [
                        0
                    ]
                }
            }
        ]
    }
}

Что если бы я вместо этого перколировал этот документ:

{
  "query": {
    "percolate": {
      "field": "query",
      "document": {
        "date":"2004-07-31T11:57:52.000Z","part":"month","code":109,"val":0,"email":"foo"
      }
    }
  }
}

(обратите внимание, чтоадрес электронной почты только foo) Это результат:

{
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.26152915,
        "hits": [
            {
                "_index": "percolator_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.26152915,
                "_source": {
                    "query": {
                        "simple_query_string": {
                            "query": "month foo@bar.com",
                            "fields": [
                                "part",
                                "email"
                            ]
                        }
                    }
                },
                "fields": {
                    "_percolator_document_slot": [
                        0
                    ]
                }
            }
        ]
    }
}

Обратите внимание, что оценка немного ниже, чем у первого перколированного документа. Это, вероятно, так, потому что foo (мое электронное письмо) соответствует только одному из терминов в моем проанализированном foo@bar.com, тогда как foo@bar.com соответствует всем им (таким образом, получая лучший результат)

Неконечно, о каком анализаторе вы говорите. Я думаю, что приведенный выше пример покрывает единственную проблему / неизвестность "анализатора", которая, я думаю, может быть немного запутывающей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...