Discourses API get just the number of search results

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.