搜索引擎是如何搜索的

发布于 2022-09-06 19:44:27 字数 55 浏览 42 评论 0

搜索引擎是如何搜索到各种网站的?浏览器跟搜索引擎是什么关系?搜索一个网站显示都具体干了哪些步骤?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

绿光 2022-09-13 19:44:27

网站的话现在不是要流行分布式搜索吗那个,elasticSearch可以学学

も星光 2022-09-13 19:44:27

一个信息检索系统一般有六个子系统组成:采选子系统、标引子系统、词语子系统、交互子系统、查询子系统、匹配子系统

其中一般由采选子系统完成信息的收集(可以理解为爬虫机器人),标引子系统完成文档的分词和关键信息标引(主要涉及自然语言处理技术),由词语子系统建立和维护系统主题词表、交互子系统提供用户界面(你看到的搜索框和一些检索配置)、查询子系统负责根据搜索提问词建立查询式、匹配子系统完成查询式和文档集之间的信息匹配(有的可能还会有一些相关度计算以根据查询进行排序)及结果返回。

以上就是一个信息检索系统的一般模型,具体的实现每个搜索引擎和可能会有不同。

我们知道网页其实就是一个个超文本文档。根据以上一般原理,我们可以想象,类似的搜索引擎就是完成了网页的抓取、分析、处理、存储、检索、排序、返回,接着你就可以看到你和你搜索的关键词匹配的结果了。

你有兴趣的话,可以找一些关于信息检索与处理相关的书看一看,GitHub上也有一些开源的搜索引擎项目可供参考。

靖瑶 2022-09-13 19:44:27

这个有点说来话长,你先看下百度百科把基本原理搞懂,下面代码是基于lucene的搜索:

package com.tray.indexData;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
  
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
  
import com.tray.bean.SerachResult;
import com.tray.common.tools.DateFormater;
  
public class LuceneSearch {
      
    private static String DISC_URL = "/home/indexData/data";
      
    static {
        String os = System.getProperty("os.name"); 
        if(os.toLowerCase().startsWith("win")){ 
            DISC_URL = "E:\\indexData\\data";
        }
        else{
            DISC_URL ="/home/indexData/data";
        }
    }
          
    //指定分词器
    private Analyzer analyzer=new IKAnalyzer();
    private static Directory directory;
    //配置
    private static IndexWriterConfig iwConfig;
    //配置IndexWriter
    private static IndexWriter writer; 
    private static File indexFile = null; 
      
    private static Version version = Version.LUCENE_36;
      
    private final int PAPGESIZE=10;
  
    /**
     * 全量索引
     * @Author haoning
     */
    public void init() throws Exception {
          
        try {
            indexFile = new File(DISC_URL);
            if (!indexFile.exists()) {
                indexFile.mkdir();
            }
            directory=FSDirectory.open(indexFile); 
            //配置IndexWriterConfig 
            iwConfig = new IndexWriterConfig(version,analyzer); 
            iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); 
                //创建写索引对象 
            writer = new IndexWriter(directory,iwConfig);  
        } catch (Exception e) {
        }
    }
      
    public void closeWriter(){
        try {
            writer.close();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
      
    public void commit(){
          
        try {
            writer.commit();
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
      
    /**
     * 一个一个索引
     * @Author haoning
     */
    public void singleIndex(Document doc) throws Exception {
        writer.addDocument(doc);
    }
      
    /**
     * 一个跟新
     * @Author haoning
     */
    public void singleUpdate(Document doc) throws Exception {
        Term term = new Term("url", doc.get("url"));
        writer.updateDocument(term,doc);
    }
      
    /**
     * 全量索引
     * @Author haoning
     */
    public void fullIndex(Document[] documentes) throws Exception {
          
        writer.deleteAll();
        for (Document document : documentes) {
            writer.addDocument(document);
        }
        writer.commit();
    }
      
    /**
     * 根据id删除索引
     * @Author haoning
     */
    public void deleteIndex(Document document)throws Exception{
        Term term = new Term("url", document.get("url"));//url才是唯一标志
        writer.deleteDocuments(term);
        writer.commit();
    }
      
    /**
     * 根据id增量索引
     * @Author haoning
     */
    public void updateIndex(Document[] documentes) throws Exception{
        for (Document document : documentes) {
            Term term = new Term("url", document.get("url"));
            writer.updateDocument(term, document);
        }
        writer.commit();
    }
      
    /**
     * 直接查询
     * @Author haoning
     */
    public void simpleSearch(String filedStr,String queryStr,int page, int pageSize) throws Exception{
        File indexDir = new File(DISC_URL); 
        //索引目录 
        Directory dir=FSDirectory.open(indexDir); 
        //根据索引目录创建读索引对象 
        IndexReader reader = IndexReader.open(dir); 
        //搜索对象创建 
        IndexSearcher searcher = new IndexSearcher(reader);
        TopScoreDocCollector topCollector = TopScoreDocCollector.create(searcher.maxDoc(), false);
          
        Term term = new Term(filedStr, queryStr);
        Query query = new TermQuery(term);
        searcher.search(query, topCollector);
        ScoreDoc[] docs = topCollector.topDocs((page-1)*pageSize, pageSize).scoreDocs;
          
        printScoreDoc(docs, searcher);
    }
      
    /**
     * 高亮查询
     * @Author haoning
     */
    public Map<String, Object> highLightSearch(String filed,String keyWord,int curpage, int pageSize) throws Exception{
        List<SerachResult> list=new ArrayList<SerachResult>();
        Map<String,Object> map = new HashMap<String,Object>();
        if (curpage <= 0) {
            curpage = 1;
        }
        if (pageSize <= 0 || pageSize>20) {
             pageSize = PAPGESIZE;
        }
        File indexDir = new File(DISC_URL); //索引目录  
        Directory dir=FSDirectory.open(indexDir);//根据索引目录创建读索引对象   
        IndexReader reader = IndexReader.open(dir);//搜索对象创建   
        IndexSearcher searcher = new IndexSearcher(reader);
          
        int start = (curpage - 1) * pageSize;
          
        Analyzer analyzer = new IKAnalyzer(true);
        QueryParser queryParser = new QueryParser(Version.LUCENE_36, filed, analyzer);
        queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
        Query query = queryParser.parse(keyWord);
          
        int hm = start + pageSize;
        TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);
        searcher.search(query, res);
          
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
          
        long amount = res.getTotalHits();
        //long pages = (rowCount - 1) / pageSize + 1; //计算总页数
          
        map.put("amount",amount);//总共多少条记录
          
        TopDocs tds = res.topDocs(start, pageSize);
        ScoreDoc[] sd = tds.scoreDocs;
          
        for (int i = 0; i < sd.length; i++) {
            Document doc = searcher.doc(sd[i].doc);
            String temp=doc.get("name");
            //做高亮处理
            TokenStream ts = analyzer.tokenStream("name", new StringReader(temp));
              
            SerachResult record=new SerachResult();
            String name = highlighter.getBestFragment(ts,temp);
            String skydirverName=doc.get("skydirverName");
            String username=doc.get("username");
            String shareTime=doc.get("shareTime");
            String describ=doc.get("describ");
            String typeId=doc.get("typeId");
            String id=doc.get("id");
            String url=doc.get("url");
              
            record.setName(name);
            record.setSkydriverName(skydirverName);
            record.setUsername(username);
            record.setShareTime(DateFormater.getFormatDate(shareTime,"yyyy-MM-dd HH:mm:ss"));
            record.setDescrib(describ);
            record.setTypeId(Integer.parseInt(typeId));
            record.setId(new BigInteger(id));
            record.setUrl(url);
            list.add(record);
              
            /*System.out.println("name:"+name);
            System.out.println("skydirverName:"+skydirverName);
            System.out.println("username:"+username);
            System.out.println("shareTime:"+shareTime);
            System.out.println("describ:"+describ);
            System.out.println("typeId:"+typeId);
            System.out.println("id:"+id);
            System.out.println("url:"+url);*/
        }
        map.put("source",list);
        return map;
    }
      
    /**
     * 根据前缀查询
     * @Author haoning
     */
    public void prefixSearch(String filedStr,String queryStr) throws Exception{
        File indexDir = new File(DISC_URL); 
        //索引目录 
        Directory dir=FSDirectory.open(indexDir); 
        //根据索引目录创建读索引对象 
        IndexReader reader = IndexReader.open(dir); 
        //搜索对象创建 
        IndexSearcher searcher = new IndexSearcher(reader);
          
        Term term = new Term(filedStr, queryStr);
        Query query = new PrefixQuery(term);
          
        ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
        printScoreDoc(docs, searcher);
    }
      
    /**
     * 通配符查询
     * @Author haoning
     */
    public void wildcardSearch(String filedStr,String queryStr) throws Exception{
        File indexDir = new File(DISC_URL); 
        //索引目录 
        Directory dir=FSDirectory.open(indexDir); 
        //根据索引目录创建读索引对象 
        IndexReader reader = IndexReader.open(dir); 
        //搜索对象创建 
        IndexSearcher searcher = new IndexSearcher(reader);
          
        Term term = new Term(filedStr, queryStr);
        Query query = new WildcardQuery(term);
        ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
        printScoreDoc(docs, searcher);
    }
      
    /**
     * 分词查询
     * @Author haoning
     */
    public void analyzerSearch(String filedStr,String queryStr) throws Exception{
        File indexDir = new File(DISC_URL); 
        //索引目录 
        Directory dir=FSDirectory.open(indexDir); 
        //根据索引目录创建读索引对象 
        IndexReader reader = IndexReader.open(dir); 
        //搜索对象创建 
        IndexSearcher searcher = new IndexSearcher(reader);
          
        QueryParser queryParser = new QueryParser(version, filedStr, analyzer);
        Query query = queryParser.parse(queryStr);
          
        ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
        printScoreDoc(docs, searcher);
    }
      
    /**
     * 多属性分词查询
     * @Author haoning
     */
    public void multiAnalyzerSearch(String[] filedStr,String queryStr) throws Exception{
        File indexDir = new File(DISC_URL); 
        //索引目录 
        Directory dir=FSDirectory.open(indexDir); 
        //根据索引目录创建读索引对象 
        IndexReader reader = IndexReader.open(dir); 
        //搜索对象创建 
        IndexSearcher searcher = new IndexSearcher(reader);
        QueryParser queryParser = new MultiFieldQueryParser(version, filedStr, analyzer);
        Query query = queryParser.parse(queryStr);
          
        ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
        printScoreDoc(docs, searcher);
    }
      
    public void printScoreDoc(ScoreDoc[] docs,IndexSearcher searcher)throws Exception{
        for (int i = 0; i < docs.length; i++) {
            List<Fieldable> list = searcher.doc(docs[i].doc).getFields();
            for (Fieldable fieldable : list) {
                String fieldName = fieldable.name();
                String fieldValue = fieldable.stringValue();
                System.out.println(fieldName+" : "+fieldValue);
            }
        }
    }
}
  

你可以看下这篇知乎专栏:
https://zhuanlan.zhihu.com/p/...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文