Elasti c фраза префикс рабочая фраза isnt - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь вернуть все документы, содержащие строку в userName и documentName.

Data:

{
  "userName" : "johnwick",
  "documentName": "john",
  "office":{
     "name":"my_office"
  }
},
{
  "userName" : "johnsnow",
  "documentName": "snowy",
  "office": {
     "name":"Abraham deVilliers"
  }
},
{
  "userName" : "johnnybravo",
  "documentName": "bravo",
  "office": {
     "name":"blabla"
  }
},
{
  "userName" : "moana",
  "documentName": "disney",
  "office": {
     "name":"deVilliers"
  }
},
{
  "userName" : "stark",
  "documentName": "marvel",
  "office": {
     "name":"blabla"
  }
}

Я могу выполнить точное сопоставление строки с:

}   
  _source": [ "userName", "documentName"],    
  "query": {
    "multi_match": {
      "query":       "johnsnow",
      "fields":      [ "userName", "documentName"]
    }
  }
}

Это успешно возвращает:

{
  "userName" : "johnsnow",
  "documentName": "snowy",
  "office": {
     "name":"Abraham deVilliers"
  }
}

Если я использую type: phrase_fix с john, я также получаю успешно 3 результата.

Но затем я пытаюсь с:

{   
  "query": {
    "multi_match": {
      "query":       "ohn",  // <---- match all docs that contain 'ohn'
      "type":        "phrase_prefix"
      "fields":      [ "userName", "documentName"]
    }
  }
}

Возвращаются нулевые результаты.

1 Ответ

1 голос
/ 16 июня 2020

То, что вы ищете, - это поиск по инфиксу, и для этого вам понадобится токенизатор ngram с анализатором времени поиска .

Полный пример с вашими образцами данных

Сопоставление и настройка индекса

{
    "settings": {
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type": "Ingram",  --> note this
                    "min_gram": 1,
                    "max_gram": 10
                }
            },
            "analyzer": {
                "autocomplete": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter"
                    ]
                }
            }
        },
        "index.max_ngram_diff" : 10 --> this you can reduce based on your requirement.
    },
    "mappings": {
        "properties": {
            "userName": {
                "type": "text",
                "analyzer": "autocomplete",
                "search_analyzer": "standard"
            },
            "documentName": {
                "type": "text",
                "analyzer": "autocomplete",
                "search_analyzer": "standard"
            }
        }
    }
}

Образец ваших документов, а затем тот же поисковый запрос, я проиндексировал только первый и последний do c для краткости, и он вернул мне первый do c

"hits": [
      {
        "_index": "infix",
        "_type": "_doc",
        "_id": "1",
        "_score": 5.7100673,
        "_source": {
          "userName": "johnwick",
          "documentName": "john"
        }
      }
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...