2015-03-17 1 views
1

Я играю и изучаю scala и elastic4s для поиска elastics.Query with elastic4s дает нулевые результаты

У меня есть скрипт python, который использует официальный модуль elasticsearch. Мой код в python выглядит так:

res=helpers.scan(es, query={"_source": ["http_uri", "header_user_agent"],"query": {"query_string": {"query": "message:key"}}}, index="") 

Мой выше код python работает. Я получаю результаты 900 КБ, и я их обрабатываю и так далее.

Я использую базовый код scala для тестирования e4s. Это простой запрос. Является ли мой запрос неправильным?

import com.sksamuel.elastic4s.ElasticClient 
import com.sksamuel.elastic4s.ElasticDsl._ 

object Banana { 
    def main(args: Array[String]) { 
     val client = ElasticClient.local 

     val res = client execute { search in "*" query "apiKey" } await 

     println(res.getHits.totalHits) 

     println(res) 
    } 
} 

Мой результат на управлении это:

info] Running Banana 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
0 
{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 0, 
    "successful" : 0, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 0, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    } 
} 

И ответ с завитка запроса:

$ curl -s 'localhost:9200/_search?q=apiKey&pretty=true' | head -12 
{ 
    "took" : 21, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1200, 
    "successful" : 1200, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 756253, 
    "max_score" : 1.5905869, 
    "hits" : [ { 

ответ

1
val client = ElasticClient.local 

эта линия означает, что elastic4s создаст свой собственный магазин данных, поэтому, если вы не индексируете свои данные в этом месте, ваш результат поиска ничего. если вы хотите подключить свой собственный Elasticsearch, вы можете:

//Set the Cluster name 
    val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build() 

    //Set the Cluster Connection 
    val client = ElasticClient.remote(settings, ("127.0.0.1", 9300)) 

и сделать поиск действий.

+0

Этот метод устарел. Итак, я использовал 'val uri = ElasticsearchClientUri (" elasticsearch: //127.0.0.1: 9300 ")' 'val client = ElasticClient.remote (uri)' Нет. нет работы. '[ошибка] (выполнения основного 0) org.elasticsearch.client.transport.NoNodeAvailableException: Ни один из настроенных узлов отсутствуют: нет []' ' org.elasticsearch.client.transport.NoNodeAvailableException: Ни один из настроенные узлы доступны: [] ' –

+0

Возможно, вы можете проверить https://github.com/sksamuel/elastic4s/blob/master/guide/search.md для поиска. – chengpohi

3

@chengpohi правильно, что вы создаете локальный узел, а не подключение к кластеру при использовании val client = ElasticClient.local, поэтому вам нужно использовать

val uri = ElasticsearchClientUri("elasticsearch://127.0.0.1:9300") 
val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "myClusterName").build() 
val client = ElasticClient.remote(settings, uri) 

Но кроме того, вы ищете в индексе называется * который не означает все индексы, как вы думаете. Если вы хотите выполнить поиск во всех индексах, вам необходимо использовать _all, например

client execute { 
    search in "_all" query "findme" 
} 
+0

Спасибо. Надо было добавить это, чтобы оно работало: 'val uri = ElasticsearchClientUri (" elasticsearch: //127.0.0.1: 9300 ")' 'val settings = ImmutableSettings.settingsBuilder(). Put (" cluster.name "," myClusterName ") .build()' 'val client = ElasticClient.remote (настройки, (uri))' –

+0

Кроме того, это также сработало. 'val resp = client.execute {search in" * "query" bananas "} .await' –

+0

Я обновил ответ, чтобы включить имя кластера. – monkjack

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