Class SolrIndexSearcher

java.lang.Object
org.apache.lucene.search.IndexSearcher
org.apache.solr.search.SolrIndexSearcher
All Implemented Interfaces:
Closeable, AutoCloseable, SolrInfoBean, SolrMetricProducer

public class SolrIndexSearcher extends org.apache.lucene.search.IndexSearcher implements Closeable, SolrInfoBean
SolrIndexSearcher adds schema awareness and caching functionality over IndexSearcher.
Since:
solr 0.9
  • Field Details

  • Constructor Details

  • Method Details

    • initCollectorExecutor

      public static ExecutorService initCollectorExecutor(NodeConfig cfg)
      Create an ExecutorService to be used by the Lucene IndexSearcher.getTaskExecutor(). Shared across the whole node because it's a machine CPU resource.
    • getDocFetcher

      public SolrDocumentFetcher getDocFetcher()
    • interrogateDocFetcher

      public <T> T interrogateDocFetcher(Function<SolrDocumentFetcher,T> func)
      Allows interrogation of docFetcher template (checking field names, etc.) without forcing it to be cloned (as it would be if an instance were retrieved via getDocFetcher()).
    • getStatsCache

      public StatsCache getStatsCache()
    • getFieldInfos

      public org.apache.lucene.index.FieldInfos getFieldInfos()
    • termStatistics

      public org.apache.lucene.search.TermStatistics termStatistics(org.apache.lucene.index.Term term, int docFreq, long totalTermFreq) throws IOException
      Overrides:
      termStatistics in class org.apache.lucene.search.IndexSearcher
      Throws:
      IOException
    • collectionStatistics

      public org.apache.lucene.search.CollectionStatistics collectionStatistics(String field) throws IOException
      Overrides:
      collectionStatistics in class org.apache.lucene.search.IndexSearcher
      Throws:
      IOException
    • localTermStatistics

      public org.apache.lucene.search.TermStatistics localTermStatistics(org.apache.lucene.index.Term term, int docFreq, long totalTermFreq) throws IOException
      Throws:
      IOException
    • localCollectionStatistics

      public org.apache.lucene.search.CollectionStatistics localCollectionStatistics(String field) throws IOException
      Throws:
      IOException
    • isCachingEnabled

      public boolean isCachingEnabled()
    • getPath

      public String getPath()
    • toString

      public String toString()
      Overrides:
      toString in class org.apache.lucene.search.IndexSearcher
    • getCore

      public SolrCore getCore()
    • maxDoc

      public final int maxDoc()
    • numDocs

      public final int numDocs()
    • docFreq

      public final int docFreq(org.apache.lucene.index.Term term) throws IOException
      Throws:
      IOException
    • getSlowAtomicReader

      public final org.apache.lucene.index.LeafReader getSlowAtomicReader()
      Not recommended to call this method unless there is some particular reason due to internally calling SlowCompositeReaderWrapper. Use IndexSearcher.leafContexts to get the sub readers instead of using this method.
    • getRawReader

      public final org.apache.lucene.index.DirectoryReader getRawReader()
      Raw reader (no fieldcaches etc). Useful for operations like addIndexes
    • getIndexReader

      public final org.apache.lucene.index.DirectoryReader getIndexReader()
      Overrides:
      getIndexReader in class org.apache.lucene.search.IndexSearcher
    • register

      public void register()
      Register sub-objects such as caches and our own metrics
    • close

      public void close() throws IOException
      Free's resources associated with this searcher.

      In particular, the underlying reader and any cache's in use are closed.

      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface SolrMetricProducer
      Throws:
      IOException
    • getSchema

      public IndexSchema getSchema()
      Direct access to the IndexSchema for use with this searcher
    • getFieldNames

      public Iterable<String> getFieldNames()
      Returns a collection of all field names the index reader knows about.
    • getFilterCache

      public SolrCache<org.apache.lucene.search.Query,DocSet> getFilterCache()
    • getFeatureVectorCache

      public SolrCache<Integer,float[]> getFeatureVectorCache()
    • initRegenerators

      public static void initRegenerators(SolrConfig solrConfig)
    • search

      public QueryResult search(QueryCommand cmd) throws IOException
      Primary entrypoint for searching, using a QueryCommand.
      Throws:
      IOException
    • search

      @Deprecated public QueryResult search(QueryResult qr, QueryCommand cmd) throws IOException
      Deprecated.
      Throws:
      IOException
    • search

      public void search(org.apache.lucene.search.Query query, org.apache.lucene.search.Collector collector) throws IOException
      Overrides:
      search in class org.apache.lucene.search.IndexSearcher
      Throws:
      IOException
    • getFieldValueCache

      public SolrCache<String,UnInvertedField> getFieldValueCache()
      expert: internal API, subject to change
    • weightSort

      public org.apache.lucene.search.Sort weightSort(org.apache.lucene.search.Sort sort) throws IOException
      Returns a weighted sort according to this searcher
      Throws:
      IOException
    • weightSortSpec

      public SortSpec weightSortSpec(SortSpec originalSortSpec, org.apache.lucene.search.Sort nullEquivalent) throws IOException
      Returns a weighted sort spec according to this searcher
      Throws:
      IOException
    • getFirstMatch

      public int getFirstMatch(org.apache.lucene.index.Term t) throws IOException
      Returns the first document number containing the term t Returns -1 if no document was found. This method is primarily intended for clients that want to fetch documents using a unique identifier."
      Returns:
      the first document number containing the term
      Throws:
      IOException
    • lookupId

      public long lookupId(org.apache.lucene.util.BytesRef idBytes) throws IOException
      lookup the docid by the unique key field, and return the id *within* the leaf reader in the low 32 bits, and the index of the leaf reader in the high 32 bits. -1 is returned if not found.
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • cacheDocSet

      public void cacheDocSet(org.apache.lucene.search.Query query, DocSet optionalAnswer, boolean mustCache) throws IOException
      Compute and cache the DocSet that matches a query. The normal usage is expected to be cacheDocSet(myQuery, null,false) meaning that Solr will determine if the Query warrants caching, and if so, will compute the DocSet that matches the Query and cache it. If the answer to the query is already cached, nothing further will be done.

      If the optionalAnswer DocSet is provided, it should *not* be modified after this call.

      Parameters:
      query - the lucene query that will act as the key
      optionalAnswer - the DocSet to be cached - if null, it will be computed.
      mustCache - if true, a best effort will be made to cache this entry. if false, heuristics may be used to determine if it should be cached.
      Throws:
      IOException
    • getDocSetBits

      public BitDocSet getDocSetBits(org.apache.lucene.search.Query q) throws IOException
      Throws:
      IOException
    • getLiveDocSet

      public BitDocSet getLiveDocSet() throws IOException
      Returns an efficient random-access DocSet of the live docs. It's cached. Never null.
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
      the type of DocSet returned may change in the future
    • getLiveDocsBits

      public org.apache.lucene.util.Bits getLiveDocsBits() throws IOException
      Returns an efficient random-access Bits of the live docs. It's cached. Null means all docs are live. Use this like LeafReader.getLiveDocs().
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • offerLiveDocs

      public BitDocSet offerLiveDocs(Supplier<DocSet> docSetSupplier, int suppliedSize)
      If some process external to SolrIndexSearcher has produced a DocSet whose cardinality matches that of `liveDocs`, this method provides such caller the ability to offer its own DocSet to be cached in the searcher. The caller should then use the returned value (which may or may not be derived from the DocSet instance supplied), allowing more efficient memory use.
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • getDocSet

      public DocSet getDocSet(List<org.apache.lucene.search.Query> queries) throws IOException
      Returns the set of document ids matching all queries. This method is cache-aware and attempts to retrieve the answer from the cache if possible. If the answer was not cached, it may have been inserted into the cache as a result of this call. This method can handle negative queries. A null/empty list results in getLiveDocSet().

      The DocSet returned should not be modified.

      Throws:
      IOException
    • getProcessedFilter

      public SolrIndexSearcher.ProcessedFilter getProcessedFilter(List<org.apache.lucene.search.Query> queries) throws IOException
      INTERNAL: Processes conjunction (AND) of the queries into a SolrIndexSearcher.ProcessedFilter result. Queries may be null/empty thus doesn't restrict the matching docs. Queries typically are resolved against the filter cache, and populate it.
      Throws:
      IOException
    • getDocSet

      public DocSet getDocSet(SolrIndexSearcher.DocsEnumState deState) throws IOException
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • getDocSetNC

      protected DocSet getDocSetNC(org.apache.lucene.search.Query query, DocSet filter) throws IOException
      Throws:
      IOException
    • getDocSet

      public DocSet getDocSet(org.apache.lucene.search.Query query) throws IOException
      Returns the set of document ids matching both the query. This method is cache-aware and attempts to retrieve a DocSet of the query from the cache if possible. If the answer was not cached, it may have been inserted into the cache as a result of this call.
      Returns:
      Non-null DocSet meeting the specified criteria. Should not be modified by the caller.
      Throws:
      IOException
      See Also:
    • getDocSet

      public DocSet getDocSet(org.apache.lucene.search.Query query, DocSet filter) throws IOException
      Returns the set of document ids matching both the query and the filter. This method is cache-aware and attempts to retrieve a DocSet of the query from the cache if possible. If the answer was not cached, it may have been inserted into the cache as a result of this call.
      Parameters:
      filter - may be null if none
      Returns:
      Non-null DocSet meeting the specified criteria. Should not be modified by the caller.
      Throws:
      IOException
    • getDocList

      @Deprecated public DocList getDocList(org.apache.lucene.search.Query query, org.apache.lucene.search.Query filter, org.apache.lucene.search.Sort lsort, int offset, int len) throws IOException
      Deprecated.
      Returns documents matching both query and filter and sorted by sort.

      This method is cache aware and may retrieve filter from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      Parameters:
      filter - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocList meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocList

      @Deprecated public DocList getDocList(org.apache.lucene.search.Query query, List<org.apache.lucene.search.Query> filterList, org.apache.lucene.search.Sort lsort, int offset, int len, int flags) throws IOException
      Deprecated.
      Returns documents matching both query and the intersection of the filterList , sorted by sort.

      This method is cache aware and may retrieve filter from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      Parameters:
      filterList - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocList meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocList

      @Deprecated public DocList getDocList(org.apache.lucene.search.Query query, org.apache.lucene.search.Sort lsort, int offset, int len) throws IOException
      Deprecated.
      Returns documents matching query, sorted by sort.

      FUTURE: The returned DocList may be retrieved from a cache.

      Parameters:
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocList meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocListAndSet

      @Deprecated public DocListAndSet getDocListAndSet(org.apache.lucene.search.Query query, org.apache.lucene.search.Query filter, org.apache.lucene.search.Sort lsort, int offset, int len) throws IOException
      Deprecated.
      Returns documents matching both query and filter and sorted by sort. Also returns the complete set of documents matching query and filter (regardless of offset and len).

      This method is cache aware and may retrieve filter from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      The DocList and DocSet returned should not be modified.

      Parameters:
      filter - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocListAndSet meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocListAndSet

      @Deprecated public DocListAndSet getDocListAndSet(org.apache.lucene.search.Query query, org.apache.lucene.search.Query filter, org.apache.lucene.search.Sort lsort, int offset, int len, int flags) throws IOException
      Deprecated.
      Returns documents matching both query and filter and sorted by sort. Also returns the compete set of documents matching query and filter (regardless of offset and len).

      This method is cache aware and may retrieve filter from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      The DocList and DocSet returned should not be modified.

      Parameters:
      filter - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      flags - user supplied flags for the result set
      Returns:
      DocListAndSet meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocListAndSet

      @Deprecated public DocListAndSet getDocListAndSet(org.apache.lucene.search.Query query, List<org.apache.lucene.search.Query> filterList, org.apache.lucene.search.Sort lsort, int offset, int len) throws IOException
      Deprecated.
      Returns documents matching both query and the intersection of filterList , sorted by sort. Also returns the compete set of documents matching query and filter (regardless of offset and len).

      This method is cache aware and may retrieve filter from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      The DocList and DocSet returned should not be modified.

      Parameters:
      filterList - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocListAndSet meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocListAndSet

      @Deprecated public DocListAndSet getDocListAndSet(org.apache.lucene.search.Query query, List<org.apache.lucene.search.Query> filterList, org.apache.lucene.search.Sort lsort, int offset, int len, int flags) throws IOException
      Deprecated.
      Returns documents matching both query and the intersection of filterList , sorted by sort. Also returns the complete set of documents matching query and filter (regardless of offset and len ).

      This method is cache aware and may retrieve filters from the cache or make an insertion into the cache as a result of this call.

      FUTURE: The returned DocList may be retrieved from a cache.

      The DocList and DocSet returned should not be modified.

      Parameters:
      filterList - may be null
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      flags - user supplied flags for the result set
      Returns:
      DocListAndSet meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • getDocListAndSet

      @Deprecated public DocListAndSet getDocListAndSet(org.apache.lucene.search.Query query, org.apache.lucene.search.Sort lsort, int offset, int len) throws IOException
      Deprecated.
      Returns the top documents matching the query and sorted by sort, limited by offset and len. Also returns compete set of matching documents as a DocSet.

      FUTURE: The returned DocList may be retrieved from a cache.

      Parameters:
      lsort - criteria by which to sort (if null, query relevance is used)
      offset - offset into the list of documents to return
      len - maximum number of documents to return
      Returns:
      DocListAndSet meeting the specified criteria, should not be modified by the caller.
      Throws:
      IOException - If there is a low-level I/O error.
    • sortDocSet

      protected void sortDocSet(QueryResult qr, QueryCommand cmd) throws IOException
      Throws:
      IOException
    • numDocs

      public int numDocs(org.apache.lucene.search.Query a, DocSet b) throws IOException
      Returns the number of documents that match both a and b.

      This method is cache-aware and may check as well as modify the cache.

      Returns:
      the number of documents in the intersection between a and b.
      Throws:
      IOException - If there is a low-level I/O error.
    • numDocs

      public int numDocs(DocSet a, SolrIndexSearcher.DocsEnumState deState) throws IOException
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • numDocs

      public int numDocs(org.apache.lucene.search.Query a, org.apache.lucene.search.Query b) throws IOException
      Returns the number of documents that match both a and b.

      This method is cache-aware and may check as well as modify the cache.

      Returns:
      the number of documents in the intersection between a and b.
      Throws:
      IOException - If there is a low-level I/O error.
    • intersects

      public boolean intersects(DocSet a, SolrIndexSearcher.DocsEnumState deState) throws IOException
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
    • bootstrapFirstSearcher

      public void bootstrapFirstSearcher()
      Called on the initial searcher for each core, immediately before firstSearcherListeners are called for the searcher. This provides the opportunity to perform initialization on the first registered searcher before the searcher begins to see any firstSearcher -triggered events.
    • warm

      public void warm(SolrIndexSearcher old)
      Warm this searcher based on an old one (primarily for auto-cache warming).
    • getCache

      public SolrCache getCache(String cacheName)
      return the named generic cache
    • cacheLookup

      public Object cacheLookup(String cacheName, Object key)
      lookup an entry in a generic cache
    • cacheInsert

      public Object cacheInsert(String cacheName, Object key, Object val)
      insert an entry in a generic cache
    • getOpenTimeStamp

      public Date getOpenTimeStamp()
    • getOpenNanoTime

      public long getOpenNanoTime()
    • explain

      public org.apache.lucene.search.Explanation explain(org.apache.lucene.search.Query query, int doc) throws IOException
      Overrides:
      explain in class org.apache.lucene.search.IndexSearcher
      Throws:
      IOException
    • getIndexFingerprint

      public IndexFingerprint getIndexFingerprint(long maxVersion) throws IOException
      Throws:
      IOException
      NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
      gets a cached version of the IndexFingerprint for this searcher
    • getName

      public String getName()
      Description copied from interface: SolrInfoBean
      Simple common usage name, e.g. BasicQueryHandler, or fully qualified class name.
      Specified by:
      getName in interface SolrInfoBean
    • getDescription

      public String getDescription()
      Description copied from interface: SolrInfoBean
      Simple one or two line description
      Specified by:
      getDescription in interface SolrInfoBean
    • getCategory

      public SolrInfoBean.Category getCategory()
      Description copied from interface: SolrInfoBean
      Category of this component
      Specified by:
      getCategory in interface SolrInfoBean
    • getSolrMetricsContext

      public SolrMetricsContext getSolrMetricsContext()
      Description copied from interface: SolrMetricProducer
      Implementations should return the context used in SolrMetricProducer.initializeMetrics(SolrMetricsContext, Attributes) to ensure proper cleanup of metrics at the end of the life-cycle of this component. This should be the child context if one was created, or null if the parent context was used.
      Specified by:
      getSolrMetricsContext in interface SolrMetricProducer
    • initializeMetrics

      public void initializeMetrics(SolrMetricsContext solrMetricsContext, io.opentelemetry.api.common.Attributes attributes)
      Description copied from interface: SolrMetricProducer
      Implementation should initialize all metrics to a SolrMetricsContext Registry/MeterProvider with Attributes as the common set of attributes that will be attached to every metric that is initialized for that class/component
      Specified by:
      initializeMetrics in interface SolrMetricProducer
      Parameters:
      solrMetricsContext - The registry that the component will initialize metrics to
      attributes - Base set of attributes that will be bound to all metrics for that component
    • getWarmupTime

      public long getWarmupTime()