Hi. I am trying to get just the number of search results from the API.
I have the following query /search.json?q=query but i just need information about how many results there are. Not blurbs, cooked, etc.
Is it possible with discourse API?
I donât think we return a âcountâ in the response, but it is something you can calculate yourself.
See the search API docs for a more detailed response example, but it will look something like this:
{
"posts": [],
"topics": [],
"users": [],
"categories": [],
"grouped_search_result": {}
}
Be default the API will return a max of 50 results. To calculate the count you need to just count the number of items in the posts array. The number items in the topics array should be the same so there is no reason to count that array too.
Sto provando ogni metodo possibile per scaricare tutti gli argomenti e i post dal mio sito: le viste âultimiâ e âpiĂš popolariâ sono limitate, e ora sto cercando di ottenere tutte le categorie ed eseguire una ricerca per categoria (simile a quanto si può fare direttamente sul sito). Ad esempio, sul nostro sito, se cerco âQ&A #q-aâ qui, ottengo oltre 50 risultati. Quando eseguo la stessa ricerca esatta utilizzando il gem Ruby discourse_api, ottengo solo 5:
irb(main):123:0> topics["posts"].length
=> 5
irb(main):124:0> topics["topics"].length
=> 5
PerchĂŠ questo non è coerente con lâinterfaccia e con quanto riportato? Qual è il modo piĂš semplice per esportare i dati? Vorrei eseguire alcune analisi NLP sul contenuto del nostro sito, ma sta risultando molto difficile ottenere semplicemente i dati. Grazie!
latest supporta la paginazione; devi solo passare i parametri correttamente e dovresti essere in grado di raggiungere tutti i topic tramite lâAPI.
Anche la ricerca supporta la paginazione.
Consiglio Reverse engineer the Discourse API come corso intensivo per capire tutti i parametri necessari.
Grazie @sam! Posso vedere (anche dalla richiesta GET) che dovrebbe essere abbastanza intuitivo: quando voglio ottenere la pagina 2, aggiungo unâopzione aggiuntiva per la pagina. Posso anche vedere che âoptionsâ è qualcosa che posso definire con la funzione discourse_api:
# frozen_string_literal: true
module DiscourseApi
module API
module Search
# Restituisce i risultati della ricerca che corrispondono al termine specificato.
#
# @param term [String] un termine di ricerca
# @param options [Hash] Un insieme personalizzabile di opzioni
# @option options [String] :type_filter Restituisce risultati del tipo specificato.
# @return [Array] Restituisce i risultati come un array di Hash.
def search(term, options = {})
raise ArgumentError.new("#{term} è richiesto ma non specificato") unless term
raise ArgumentError.new("#{term} è richiesto ma non specificato") unless !term.empty?
response = get('/search/query', options.merge(term: term))
response[:body]
end
end
end
end
Quindi, provando questo, mi aspetterei di ottenere risultati diversi qui per la pagina 1 e la 2. Oppure, per dare un poâ piĂš di separazione, proviamo con le pagine 1 e 3. La query è per tutti gli argomenti Q&A:
query = category["name"] + " #" + category["slug"]
=> "Q&A #q-a"
Ora recuperiamo le pagine 1 e 3 utilizzando il client discourse_api:
topics1 = client.search(query, options={"page": "1"})
topics3 = client.search(query, options={"page": "3"})
Posso esaminare il primo argomento per ciascuno:
=> {"id"=>220, "title"=>"Why am I exceeding the quota?", "fancy_title"=>"Why am I exceeding the quota?", "slug"=>"why-am-i-exceeding-the-quota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
irb(main):148:0> topics3['topics'][0]
=> {"id"=>220, "title"=>"Why am I exceeding the quota?", "fancy_title"=>"Why am I exceeding the quota?", "slug"=>"why-am-i-exceeding-the-quota", "posts_count"=>3, "reply_count"=>0, "highest_post_number"=>3, "image_url"=>nil, "created_at"=>"2018-06-01T12:56:12.120Z", "last_posted_at"=>"2018-06-15T16:41:44.736Z", "bumped"=>true, "bumped_at"=>"2018-06-15T16:41:44.736Z", "unseen"=>false, "pinned"=>false, "unpinned"=>nil, "visible"=>true, "closed"=>false, "archived"=>false, "bookmarked"=>nil, "liked"=>nil, "tags"=>["storage", "quota"], "category_id"=>26, "has_accepted_answer"=>false}
Sono esattamente gli stessi, il che penso significhi che la variabile page non funziona? Quando ispeziono con gli strumenti di sviluppo di Chrome, il punto viene attivato scorrendo verso il basso (poichÊ i post vengono caricati automaticamente nella finestra) e posso confermare che page=2 è il parametro corretto:
Request URL: https://ask.cyberinfrastructure.org/search?q=Q%26A%20%23q-a&page=2
Request Method: GET
Status Code: 200 (from ServiceWorker)
Referrer Policy: strict-origin-when-cross-origin
o, meglio ancora, basta guardare lâelenco dei parametri:
Query String Parameters
q: Q&A #q-a
page: 2
Non si tratta di un invio di modulo, quindi non vedo alcun âForm Dataâ come nellâesempio.
Qualcuno ha qualche consiglio? Ho provato quanto suggerito, ma non vedo un passo logico successivo. La variabile della pagina non sembra funzionare quando viene fornita con la richiesta.
Il gem Discourse API utilizza la rotta /search/query. Sembra che non supporti la paginazione. Lâinterfaccia utente di Discourse utilizza invece la rotta /search, che supporta la paginazione.
Puoi verificare questo comportamento nel tuo browser andando su http://forum.example.com/search.json?q=test e poi provando http://forum.example.com/search.json?q=test&page=2.
Potresti dover trovare un modo per effettuare la chiamata API senza utilizzare il gem Discourse API. Se il tuo obiettivo è ottenere tutti i topic e i post del tuo sito, lâuso della rotta /search non sembra lâapproccio migliore.
Potresti provare a effettuare una chiamata API a http://forum.example.com/c/your-category-slug.json. Se non tutti i topic della categoria vengono restituiti nella richiesta, lâoggetto topic_list della risposta conterrĂ una proprietĂ more_topics_url che indica la rotta per la pagina successiva dei topic. Questa avrĂ un aspetto simile a "/c/site-feedback?page=2". Dovrai aggiungere .json allâURL per ottenere i dati JSON (/c/site-feedback.json?page=2).
Grazie! Ha funzionato perfettamente, ed è molto piÚ semplice in Python con requests (stavo rendendo le cose difficili apposta per abituarti meglio con Ruby, ma il client non aveva ciò che mi serviva). Sono quasi finito con le esportazioni e non ho ancora fatto nulla di machine learning, ma se qualcuno è interessato alle chiamate che ho effettuato, gli script veloci sono qui: GitHub - hpsee/discourse-cluster: Simple scripts to export posts for a discourse category, and do a clustering ¡ GitHub. Spero di fare presto qualche clustering interessante!
Grazie ancora @sam e @simon - nel caso altri fossero interessati a fare un semplice esportazione dei topic, o (andare oltre) e fare qualche clustering con visualizzazioni in d3, ho scritto un breve post che spiega come fare: AskCI Discourse Clustering | VanessaSaurus. E ancora, tutto il necessario per iniziare si trova nel repository che ho linkato in precedenza.