Similarity Queries in Elasticsearch

Elasticsearch, a fast open-source search and analytics, employs a “more like this” query. This query helps identify relevant documents based on the topics and concepts, or even close text match of the input document or set of documents.

The more like this query is useful especially when coming up with a set of results or a list of recommendations when you get some results closely associated with other contents. This can be useful when a particular query requires identifying semantic relations that do not necessarily relate to the keywords used for the search.

Key Components of Similarity Query

Key components of similarity queries in information retrieval:

More Like This (MLT) Query

The More Like This (MLT) query is a type of similarity query that allows users to find documents similar to a given document or a set of documents. It works by analyzing the content of the provided documents and generating a query based on the relevant terms and their weights. This generated query is then used to retrieve similar documents from the index.

The MLT query is handy in scenarios where users have a specific document that they find relevant and want to discover other related documents without explicitly formulating a query. It leverages the idea that documents containing similar term distributions are likely to be related.

BM25 Similarity

BM25 (Best Matching 25) is a ranking function used in information retrieval to estimate the relevance of a document to a given query. It is a bag-of-words retrieval function that ranks documents based on the similarity between the query terms and the document terms, considering term frequency and document length.

The BM25 similarity algorithm works by calculating a score for each document based on the following factors:

  • Term Frequency (TF): The frequency of a term in the document.
  • Inverse Document Frequency (IDF): The rarity of a term across the entire document collection.
  • Document Length: The length of the document, which is used for normalization.
  • Query Term Weights: Each query term’s importance can be adjusted based on user preferences or other factors.

The BM25 score is calculated for each document, and the documents are ranked based on their scores, with higher scores indicating a greater relevance to the query.

Using Similarity Queries in Elasticsearch

Elasticsearch offers a powerful query type called “more like this” (MLT). This feature helps find documents similar to a given text or a set of documents. It’s especially useful for recommendations, searching for related content, and other tasks that need to match text similarity.

Syntax:

GET /index_name/_search
{
"query": {
"more_like_this": {
"fields": ["field1", "field2", ...],
"like": "text to find similar documents",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}

In this query:

  • fields specify the fields to analyze for similarity (title and plot).
  • like is the text to find similar documents .
  • min_term_freq is the minimum term frequency (1 means all terms are considered).
  • max_query_terms limits the number of query terms (12 is a good starting point).

How It Works

The “more like this” query reprocesses the input text and processes the text by evaluating the most important parts of it using techniques like the term frequency-inverse document frequency (TF-IDF). It will then look for other documents related to the same topics, even though they might contain a different set of words and phrases.

For instance, performing a “these are more like this” search on a document about dog training would return documents that are similar to this topic, in addition to documents containing the words “dog” and “training” such as documents about animals, pets, training behavior and so on.

Example Usage

Let’s look at a simple example using the “movie_reviews” index that contains movie review text data. We’ll find documents similar to the review text for the movie “The Sunchaser“:

GET /movie_reviews/_search{
"query": {
"more_like_this": {
"fields": [
"title",
"plot"
],
"like": "After years of suffering from a mental illness, a young man starts making videos about the relationship between his wildly outrageous alter egos and himself.",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}

Elasticsearch will analyze this text, determine the key topics/concepts, and return the top documents that are most topically similar to this movie’s description.

Elasticsearch might return results like:

"hits": [
{
"_id": "5",
"_score": 0.52932465,
"plot": "A psychological thriller about a man who is sometimes controlled by his murder-loving alter ego."
},
{
"_id": "115",
"_score": 0.4576271,
"plot": "A young man struggles with his identity, becoming the alter egos he creates to cope with abuse."
},
{
"_id": "287",
"_score": 0.3914126,
"plot": "A man with 24 personalities tries to find the 25th personality that murdered someone."
}
]

Customizing Similarity

You can customize the “more like this” query in several ways:

  • Use minimum_should_match to require more or fewer matching terms
  • Boost certain fields with “fields”: [“title^2”, “plot”]
  • Use stop_words to ignore common stopwords
  • Set max_doc_freq to ignore common terms across documents
  • Use a filter to limit results by other criteria

The “more like this” query provides a powerful semantic relevance capability built into Elasticsearch’s core functionality. It opens up many interesting use cases around recommendations, related content, semantic search, and more.

Conclusion

The “more like this” query in Elasticsearch enables powerful semantic similarity searches across your data. By analyzing the key topics and concepts within the text, it can find related documents even when they don’t share many of the same words or phrases. This allows for more intelligent recommendations, discovery of related content, and enhanced search experiences.