Skip to content

Module HTM::LongTermMemory::RelevanceScorer

Defined in lib/htm/long_term_memory/relevance_scorer.rb

Relevance scoring for search results

Combines multiple signals to calculate dynamic relevance: * Vector similarity (semantic match) - config.relevance_semantic_weight (default: 0.5) * Tag overlap (categorical match) - config.relevance_tag_weight (default: 0.3) * Recency (freshness) - config.relevance_recency_weight (default: 0.1) * Access frequency (popularity/utility) - config.relevance_access_weight (default: 0.1)

Recency decay uses configurable half-life: config.relevance_recency_half_life_hours (default: 168 = 1 week)

Also provides tag similarity calculations using hierarchical Jaccard.

Constants

ACCESS_SCORE_NORMALIZER

Access frequency normalization

DEFAULT_NEUTRAL_SCORE

Default score when signal is unavailable

RELEVANCE_MAX

Not documented.

RELEVANCE_MIN

Not documented.

RELEVANCE_SCALE

Final score scaling

Public Instance Methods

calculate_relevance(node:, query_tags: [], vector_similarity: nil, node_tags: nil)

Calculate dynamic relevance score for a node given query context - @param node [Hash] Node data with similarity, tags, created_at, access_count - @param query_tags [Array] Tags associated with the query - @param vector_similarity [Float, nil] Pre-computed vector similarity (0-1) - @param node_tags [Array, nil] Pre-loaded tags for this node (avoids N+1 query) - @return [Float] Composite relevance score (RELEVANCE_MIN to RELEVANCE_MAX)

fetch_candidates_by_timeframe(timeframe:, metadata:, limit:)

Fetch candidates by timeframe using raw SQL (avoids ORM overhead) - @param timeframe [nil, Range, Array] Time range(s) to search - @param metadata [Hash] Filter by metadata fields - @param limit [Integer] Maximum results - @return [Array] Candidate nodes as hashes

recency_half_life_hours()

Not documented.

search_by_tags(tags:, match_all: false, timeframe: nil, limit: 20)

Search nodes by tags - @param tags [Array] Tags to search for - @param match_all [Boolean] If true, match ALL tags; if false, match ANY tag - @param timeframe [Range, nil] Optional time range filter - @param limit [Integer] Maximum results - @return [Array] Matching nodes with relevance scores

search_with_relevance(timeframe:, query: nil, query_tags: [], limit: 20, embedding_service: nil, metadata: {})

Search with dynamic relevance scoring

Returns nodes with calculated relevance scores based on query context - @param timeframe [nil, Range, Array] Time range(s) to search (nil = no filter) - @param query [String, nil] Search query - @param query_tags [Array] Tags to match - @param limit [Integer] Maximum results - @param embedding_service [Object, nil] Service to generate embeddings - @param metadata [Hash] Filter by metadata fields (default: {}) - @return [Array] Nodes with relevance scores

weight_access()

Not documented.

weight_recency()

Not documented.

weight_semantic()

Configurable scoring weights (via HTM.configuration)

weight_tag()

Not documented.