Module: OllamaChat::WebSearching

Included in:
Chat
Defined in:
lib/ollama_chat/web_searching.rb

Overview

A module that provides web search functionality for OllamaChat.

The WebSearching module encapsulates the logic for performing web searches using configured search engines. It handles query construction information integration, and delegates to engine-specific implementations for retrieving search results. The module supports multiple search engines including SearxNG and DuckDuckGo, making it flexible for different deployment scenarios and privacy preferences.

Examples:

Performing a web search

chat.search_web('ruby programming tutorials', 5)

Instance Method Summary collapse

Instance Method Details

#search_engineString (private)

The search_engine method returns the currently configured web search engine to be used for online searches.

Returns:

  • (String)

    the name of the web search engine



42
43
44
# File 'lib/ollama_chat/web_searching.rb', line 42

def search_engine
  config.web_search.use
end

#search_web(query, n = nil) ⇒ Array<String>?

The search_web method performs a web search using the configured search engine. It limits the number of results. The method delegates to engine-specific search methods based on the configured search engine.

Parameters:

  • query (String)

    the search query string

  • n (Integer) (defaults to: nil)

    the maximum number of results to return

Returns:

  • (Array<String>, nil)

    an array of URLs from the search results or nil if the search engine is not implemented



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ollama_chat/web_searching.rb', line 24

def search_web(query, n = nil)
  n     = n.to_i.clamp(1..)
  query = URI.encode_uri_component(query)
  search_command = :"search_web_with_#{search_engine}"
  if respond_to?(search_command, true)
    send(search_command, query, n)
  else
    STDOUT.puts "Search engine #{bold{search_engine}} not implemented!"
    nil
  end
end

#search_web_with_duckduckgo(query, n) ⇒ Array<String> (private)

The search_web_with_duckduckgo method performs a web search using the DuckDuckGo search engine and extracts URLs from the search results.

Parameters:

  • query (String)

    the search query string to be used

  • n (Integer)

    the maximum number of URLs to extract from the search results

Returns:

  • (Array<String>)

    an array of URL strings extracted from the search results



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/ollama_chat/web_searching.rb', line 70

def search_web_with_duckduckgo(query, n)
  url = config.web_search.engines.duckduckgo.url % { query: }
  get_url(url, cache:) do |tmp|
    result = []
    doc = Nokogiri::HTML(tmp)
    doc.css('.results_links').each do |link|
      if n > 0
        url = link.css('.result__a').first&.[]('href')
        url.sub!(%r(\A(//duckduckgo\.com)?/l/\?uddg=), '')
        url.sub!(%r(&rut=.*), '')
        url = URI.decode_uri_component(url)
        url = URI.parse(url)
        url.host =~ /duckduckgo\.com/ and next
        url = url.to_s
        links.add(url)
        result << url
        n -= 1
      else
        break
      end
    end
    result
  end
end

#search_web_with_searxng(query, n) ⇒ Array<String> (private)

The search_web_with_searxng method performs a web search using the SearxNG engine and returns the URLs of the first n search results.

Parameters:

  • query (String)

    the search query string

  • n (Integer)

    the number of search results to return

Returns:

  • (Array<String>)

    an array of URLs from the search results



53
54
55
56
57
58
59
# File 'lib/ollama_chat/web_searching.rb', line 53

def search_web_with_searxng(query, n)
  url = config.web_search.engines.searxng.url % { query: }
  get_url(url, cache:) do |tmp|
    data = JSON.parse(tmp.read, object_class: JSON::GenericObject)
    data.results.first(n).map(&:url)
  end
end