2014-01-08 6 views
0

Я пытаюсь реализовать функцию автозаполнения из фраз, содержащих несколько слов.Elasticsearch начинается с нескольких слов

Я хочу, чтобы иметь возможность сопоставлять только начало слов (edgeNGram?), Но для каждого слова, которое искали.

Например, если я ищу «монитор», я должен получить все фразы, в которых есть монитор слов, но если я ищу «onitor», я не должен получать совпадений (из набора данных ниже). Также поиск «mon ap» должен дать мне «APNEA MONITOR-SCHULTE Vital Signs Monitor», например, и «mon rrr» в свою очередь не даст никаких результатов.

Итак, мой вопрос: как мне его реализовать?

Итак, вкратце: соответствующие фразы должны содержать слова, начинающиеся с условий поиска.

Вот мое отображение:

{ 
    "quicksearch2" : { 
     "results" : { 
      "properties" : {  
       "phrase" : { 
        "type" : "string", 
        "index_analyzer" : "quicksearch_index_analyzer", 
        "search_analyzer" : "quicksearch_search_analyzer" 
       }   
      } 
     } 
    } 
} 

А вот мои настройки:

{ 
    "quicksearch2" : { 
     "settings" : { 
      "index.analysis.analyzer.quicksearch_index_analyzer.filter.4" : "left_ngram", 
      "index.analysis.analyzer.quicksearch_search_analyzer.filter.3" : "unique", 
      "index.analysis.analyzer.quicksearch_index_analyzer.filter.3" : "unique", 
      "index.analysis.filter.left_ngram.max_gram" : "20", 
      "index.analysis.analyzer.quicksearch_search_analyzer.filter.2" : "asciifolding", 
      "index.analysis.analyzer.quicksearch_search_analyzer.tokenizer" : "keyword", 
      "index.analysis.analyzer.quicksearch_search_analyzer.filter.1" : "lowercase", 
      "index.number_of_replicas" : "0", 
      "index.analysis.analyzer.quicksearch_search_analyzer.filter.0" : "trim", 
      "index.analysis.filter.left_ngram.type" : "edgeNGram", 
      "index.analysis.analyzer.quicksearch_search_analyzer.type" : "custom", 
      "index.analysis.analyzer.quicksearch_index_analyzer.filter.0" : "trim", 
      "index.analysis.analyzer.quicksearch_index_analyzer.filter.2" : "asciifolding", 
      "index.analysis.analyzer.quicksearch_index_analyzer.filter.1" : "lowercase", 
      "index.analysis.analyzer.quicksearch_index_analyzer.type" : "custom", 
      "index.analysis.filter.left_ngram.side" : "front", 
      "index.analysis.analyzer.quicksearch_index_analyzer.tokenizer" : "keyword", 
      "index.number_of_shards" : "1", 
      "index.version.created" : "900899", 
      "index.uuid" : "Lb7vC-eHQB-u_Okm3ERLow" 
     } 
    } 
} 

Вот мой запрос:

query: { 
    match: { 
     phrase: { 
      query: term, 
      operator: 'and' 
     } 
} 

Некоторые образцы данных:

{ 
    "took" : 133, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 1, 
     "successful" : 1, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 6197, 
     "max_score" : 1.491863, 
     "hits" : [ { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "emCydgTfQwuKkl4sSZoosQ", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "AXCO5rUxRwC9SebXcQxXeQ", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor, Neonatal" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "tjJq3klPTsmP8akOc18Htw", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor, Recording" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "-FjKWxl9Rm6-byn-wlpoIw", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Cardiorespiratory Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "Q19k6V6VQ6ulZOLCfESQ6w", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Impedance Pneumograph Bedside Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "YLI1er3cRjSyGumWNVi0pg", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Impedance Pneumograph Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "n5j1SaXeS2W6NymaYAYD6A", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Neonatal Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "U7Q5XrrHRbKOIwfRWO6RTQ", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Pulmonary Function Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "aF_THiCKRIyzunCbBxJTEg", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "APNEA MONITOR- SCHULTE Vital Signs Monitor" 
      } 
     }, { 
      "_index" : "quicksearch2", 
      "_type" : "results", 
      "_id" : "8BAjZfwMQjWmrkqCO7o6gg", 
      "_score" : 1.491863, 
      "fields" : { 
       "phrase" : "P.P.M. - PORTABLE PRECISION MONITOR Gas Monitor, Atmospheric" 
      } 
     } ] 
    } 
} 
+0

Вы прочитали это? http://jontai.me/blog/2013/02/adding-autocomplete-to-an-elasticsearch-search-application/ – phoet

ответ

0

Изменения в tokenizers (как индекс и поиск) от ключевого слова стандарту похоже, сделали трюк.

1

Я не совсем уверен, почему то, что вы делаете, не работает, но вот метод, который, похоже, делает то, что вы хотите.

Я создал индекс с этими параметрами:

curl -XPUT "http://localhost:9200/test_index " -d' 
{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "my_edge_ngram_filter": { 
       "type": "edgeNGram", 
       "min_gram": 2, 
       "max_gram": 20, 
       "token_chars": [ 
        "letter", 
        "digit" 
       ] 
      } 
     }, 
     "analyzer": { 
      "my_ngram_analyzer": { 
       "type": "custom", 
       "tokenizer": "whitespace", 
       "filter": [ 
        "lowercase", 
        "asciifolding", 
        "my_edge_ngram_filter" 
       ] 
      }, 
      "my_whitespace_analyzer": { 
       "type": "custom", 
       "tokenizer": "whitespace", 
       "filter": [ 
        "lowercase", 
        "asciifolding" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "docs": { 
     "properties": { 
      "phrase": { 
       "type": "string", 
       "index_analyzer": "my_ngram_analyzer", 
       "search_analyzer": "my_whitespace_analyzer" 
      } 
     } 
     } 
    } 
}' 

Затем добавляют документы, которые вы перечислили:

curl -XPOST "http://localhost:9200/test_index/_bulk " -d' 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "1" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "2" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor, Neonatal" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "3" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Apnea Monitor, Recording" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "4" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Cardiorespiratory Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "5" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Impedance Pneumograph Bedside Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "6" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Impedance Pneumograph Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "7" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Neonatal Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "8" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Pulmonary Function Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "9" } } 
{ "phrase" : "APNEA MONITOR- SCHULTE Vital Signs Monitor" } 
{ "index" : { "_index" : "test_index", "_type" : "docs", "_id" : "10" } } 
{ "phrase" : "P.P.M. - PORTABLE PRECISION MONITOR Gas Monitor, Atmospheric" } 
' 

И следующие поиски, кажется, возвращает результаты, которые вы ожидали:

curl -XPOST "http://localhost:9200/test_index/_search" -d' 
{ 
    "query": { 
     "match": { 
      "phrase" : { 
       "query": "monitor", 
       "operator": "and" 
      } 
     } 
    } 
}' 

возвращает все документы,

curl -XPOST "http://localhost:9200/test_index/_search" -d' 
{ 
    "query": { 
     "match": { 
      "phrase" : { 
       "query": "onitor", 
       "operator": "and" 
      } 
     } 
    } 
}' 

не возвращать, а

curl -XPOST "http://localhost:9200/test_index/_search" -d' 
{ 
    "query": { 
     "match": { 
      "phrase" : { 
       "query": "mon ap", 
       "operator": "and" 
      } 
     } 
    } 
}' 

возвращает все, но документ "10".

Вот работоспособный пример вы можете играть с (требуется ES установлены и запущенно на локальном хосте: 9200, или поставить другую конечную точку): http://sense.qbox.io/gist/19fdcdb20c24436c64b7656c3b8002fe78667b12

 Смежные вопросы

  • Нет связанных вопросов^_^