2016-01-19 3 views
1

У меня есть текст в эластичном поиске, содержащий URL-адреса в различных форматах (http://www, www.), Что я хочу сделать, это искать все тексты, содержащие, например, google.com.Elasticsearch - query_string с подстановочными знаками

Для текущего поиска я использую что-то вроде этого запроса:

query = { "query": { 
       "bool": { 
        "must": [{ 
          "range": { 
          "cdate": { 
           "gt": dfrom, 
           "lte": dto } 
          } 
         }, 
      { "query_string":{ 
       "default_operator": "AND", 
       "default_field": "text", 
       "analyze_wildcard":"true", 
       "query": searchString } } 
      ] 
     } 
     }} 

Но запрос, похожий google.com никогда не возвращает никакого результата, поиск, например, термин «тест» отлично работает (без «). Я хочу использовать QUERY_STRING, потому что я хотел бы использовать логические операторы, но мне действительно нужно, чтобы иметь возможность поиска подстроки не только целые слова.

Спасибо!

+0

Что такое отображение вашего URL-адреса? – ChintanShah25

+0

«текст» - это просто текстовое поле. – pinas

ответ

0

Полнотекстовый поиск всегда абу t точные совпадения в инвертированном индексе, если вы не выполняете поиск по диким картам, который заставляет перемещаться по инвертированному индексу. Использование подстановочного знака в начале вашего запросаString приведет к полному перемещению вашего индекса и не рекомендуется.

Учитывайте не только индексацию URL-адреса, но и домена (путем удаления протокола, субдомена и любой информации, следующей за доменом) с применением Keyword Tokenizer. Затем вы можете искать домены в этом поле.

+0

HI - Возможно, я объяснил это плохо. То, что я делаю, - это индексировать сообщения из внутренней вики компании (на самом деле комментарии) и пытаться сделать их доступными для поиска. Один из запросов, который я хотел бы выполнить, - найти все ссылки pastebin, которые когда-либо упоминались в этих комментариях. Поэтому я не индексирую только URL-адреса, но текстовые комментарии, которые могут содержать ссылки pastebin. В будущем я хотел бы делать запросы, такие как «все комментарии, содержащие ссылку pastebin и слово« test engine ». - Строка запроса кажется прекрасной, но эти логические операции, но подстановочные знаки не работают. – pinas

1

Действительно, http://www.google.com будет обозначаться стандартным анализатором в http и www.google.com и, следовательно, google.com не будет найден.

Таким образом, стандартный анализатор не поможет здесь, нам нужен фильтр токенов, который правильно преобразует токены URL. Другой способ, если поле text содержит только URL-адреса, должно было бы использовать UAX Email URL tokenizer, но поскольку поле может содержать любой другой текст (например, комментарии пользователей), это не сработает.

К счастью, есть новый плагин вокруг называется analysis-url который обеспечивает токенов фильтр URL, и это именно то, что нам нужно (после small modification я просил, спасибо @jlinn ;-))

Во-первых, вам нужно установите плагин:

bin/plugin install https://github.com/jlinn/elasticsearch-analysis-url/releases/download/v2.2.0/elasticsearch-analysis-url-2.2.0.zip 

Тогда мы можем начать играть. Нам необходимо создать надлежащий анализатор для text области:

curl -XPUT localhost:9200/test -d '{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "url_host": { 
      "type": "url", 
      "part": "host", 
      "url_decode": true, 
      "passthrough": true 
     } 
     }, 
     "analyzer": { 
     "url_host": { 
      "filter": [ 
      "url_host" 
      ], 
      "tokenizer": "whitespace" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "url": { 
     "properties": { 
     "text": { 
      "type": "string", 
      "analyzer": "url_host" 
     } 
     } 
    } 
    } 
}' 

С помощью этого анализатора и отображения, мы можем правильно индексировать хост вы хотите, чтобы иметь возможность искать. Например, давайте проанализируем строку blabla bla http://www.google.com blabla с использованием нашего нового анализатора.

curl -XGET 'localhost:9200/urls/_analyze?analyzer=url_host&pretty' -d 'blabla bla http://www.google.com blabla' 

Мы получим следующие символы:

{ 
    "tokens" : [ { 
    "token" : "blabla", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 0 
    }, { 
    "token" : "bla", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 1 
    }, { 
    "token" : "www.google.com", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 2 
    }, { 
    "token" : "google.com", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 3 
    }, { 
    "token" : "com", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 4 
    }, { 
    "token" : "blabla", 
    "start_offset" : 0, 
    "end_offset" : 0, 
    "type" : "word", 
    "position" : 5 
    } ] 
} 

Как вы можете видеть http://www.google.com часть будет лексемы в:

  • www.google.com
  • google.com т.е.что вы ожидали
  • com

Так что теперь, если ваш searchString является google.com вы сможете найти все документы, которые имеют text поле, содержащее google.com (или www.google.com).

+0

@pinas Вы могли попробовать это? – Val

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